boost :: bind作为l值对象

时间:2011-09-16 11:42:37

标签: c++ functor boost-bind lvalue

有没有办法做这样的事情(MS VS 2008)?

boost::bind mybinder = boost::bind(/*something is binded here*/);
mybinder(/*parameters here*/); // <--- first call
mybinder(/*another parameters here*/); // <--- one more call

我试过

int foo(int){return 0;}

boost::bind<int(*)(int)> a = boost::bind(f, _1);

但它不起作用。

2 个答案:

答案 0 :(得分:3)

int foo(int){return 0;}
boost::function<int(int)> a = boost::bind(f, _1);

答案 1 :(得分:2)

bind返回未指定的类型,因此您无法直接创建该类型的变量。但是,有一个类型模板boost::function可以构造为任何函数或函数类型。所以:

boost::function<int(int)> a = boost::bind(f, _1);

应该做的伎俩。另外,如果你没有绑定任何值,只有占位符,你可以完全没有bind,因为function也可以从函数指针构造。所以:

boost::function<int(int)> a = &f;
只要fint f(int)

就应该有效。该类型使用C ++ 11作为std::function与C ++ 11闭包(和bind一起使用,也被接受):

std::function<int(int)> a = [](int i)->int { return f(i, 42); }

请注意,要在C ++ 11中直接调用它,auto的新用法会更容易:

auto a = [](int i)->int { return f(i, 42); }

但是如果你想传递它,std::function仍然派上用场。