2011-09-16 51 views
0

有没有办法做这样的事情(MS VS 2008)?提高::绑定为L-值对象

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); 

,但它不工作。

+0

“不起作用”是什么意思? –

+9

请接受一些以前的答案。你已经在这里待了一年多了,这已经足够了解SO的工作原理了。 –

回答

2

该绑定返回未指定类型,因此您不能直接创建该类型的变量。然而,有一种类型模板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仍然派上用场了。

+0

如果你使用C++ 11和lambdas,你应该使用'std :: function'。 –

+0

@Tomalak:我扩展了C++ 11的部分,并在那里切换到了'std ::'。 –

+0

Mucho bettero! :d –

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

这也不对。 'a'应该可以直接将'foo'等同于函数指针 - 这里不需要绑定。 – Puppy

+0

我得到了“错误C2079:'a'使用未定义的类'boost :: function​​'' – fogbit

+0

@fogbit:然后你没有'#include'boost.function。 –