一个关于boost::function与c++重载的问题

docici 发布于 2013/05/22 09:56
阅读 223
收藏 0
#include <function>
#include "boost/function.hpp"
#include "boost/bind.hpp"
struct my_point{
	int x_, y_;
	void print() const {
		cout<< "(" << x_ << "," << y_ << ")" << endl;
	} 
	void print() {
		cout<< "(" << ++x_ << "," << ++y_ << ")" << endl;
	} 
};
int _tmain(int argc, char* argv[]){
	vector<my_point> vec(10);
	//此处要么将f的声明改为: boost::function<void(my_point&)> f;
	//要么注释my_point定义中const版本的print, 才能通过编译;	
	//我想问的是, 为什么f不能根据自己的声明, 自动选择相应的重载版本呢?
	boost::function<void(my_point const&)> f = boost::bind(&my_point::print, _1);
	std::for_each(vec.begin(), vec.end(), f);
    return 0;
}

加载中
0
zhuang
zhuang
#include <functional>
#include <vector>
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace std;

struct my_point{
	int x_, y_;
	my_point(int x = 0, int y = 0):
		x_(x), y_(y)
		{

		}
		
	void print() const{
		cout<<"("<<x_<<","<<y_<<")"<<endl;
	}
	void print(){
		cout<<"("<<++x_<<","<<++y_<<")"<<endl;
	}
};

int main(int argc, char *argv[])
{
	vector<my_point> vec(10);	
	my_point pt(10, 10);	

	boost::function<void (my_point &)> f = boost::bind(&my_point::print, _1);
	std::for_each(vec.begin(), vec.end(), f);	

	boost::function<void (my_point const&)> f1 = boost::bind(static_cast<void (my_point::*)() const>(&my_point::print), _1);
	std::for_each(vec.begin(), vec.end(), f1);	

	return 0;
}
0
docici
docici
 楼主高手, 谢谢啊, 原来要显示地cast(回答地真神速啊)
0
rxaa
rxaa

这个用c++11的lambda更简单安全高效

auto f =[](my_point const & mp){
		mp.print();
	};
	std::for_each(vec.begin(), vec.end(), f);
	
	auto f2 =[](my_point & mp){
		mp.print();
	};
	std::for_each(vec.begin(), vec.end(), f2);

0
甘薯
甘薯

C++的复杂真是名不虚传,

一般队员看到这么可怕的代码恐怕已经挂了。

返回顶部
顶部