void test1()
{
//do something
}
void test2(int i)
{
//do something
}
void test3(int i, int j)
{
}
struct A
{
void test(int i, int j)
{
}
}
boost::function<void()> f;
boost::function<void(int)> f1
f = boost::bind(&test1);
f();
f = boost::bind(&test2, 1);
f();
f = boost::bind(&test3, 1, 2);
f();
f1 = boost::bind(&test3, 1, _1);
f1(2);//此处要传参数所以要用f1
A a;
f = boost::bind(&A::test, &a, 1, 2);
f();
f1 = boost::bind(&A::test, &a, 1, _1);
f1(2); //此处要传参数所以要用f1
可以看出boost::function<>模板只要提供了返回值和调用function时候传递的参数类型就行了,如果调用时候没有参数就可以boost::function<void()>通吃了
以前实现一个异步sql查询需要实现好多参数模板,一个继承一个,简直到最后自己都看不懂,出错调试简直是看天书。现在好了直接用个队列里面放boost::function<void(ResultSet*)>和sql语句, 查询时候bind好给回调函数和传递的参数,用一个线程取队列查询完后执行function把结果集传给回掉函数。