希望能够做类似
的事情std::map<EventType, boost::function<bool(int,int)> callbackMap;
callbackMap[EVENT1] = boost::bind( magic_creator( this->m_isHerp && !this->m_isDerp ) , _1, _2 );
基本上给一个对magic_creator求值为true或false的表达式,它返回一个我可以用boost绑定的函数。所以在上面的例子中,magic_creator会创建一个函数,无论_1和_2如何都会返回true。我无法使用lamdas,因为它对我无益。有人为此得到了什么吗?
P.S假设callbackMap是某个类的一部分,上面代码的当前范围也是如此。
答案 0 :(得分:1)
对Boost Lambda Library,Boost.Bind或Boost.Phoenix bind
来说,这实际上是可行的而不是 丑陋。
从任何这些库调用bind
返回的所有占位符和活页夹类型都会使各种运算符重载,因此您可以“动态”地使用它们轻松创建表达式。使用Boost.Bind:
#include <iostream>
#include <boost/bind.hpp>
struct X{ bool a, b; };
int main(){
using boost::bind;
auto op = bind(&X::a, _1) && !bind(&X::b, _1);
X x{true, false};
auto test = bind(op, x);
if(test())
std::cout << "Yay\n";
}
当然,这通过成员指针有明显的缺点。另外,在C ++ 03中,你写出了这样一个“lambda”的类型有一个强大的问题,因为它是一个巨大的模板混乱。上面的小例子将产生一个巨大的名字,可以看出here。由于图书馆解决方案不是“最好的”,标准委员会在语言中加入了lambdas。耶。
请注意,虽然C ++ 11的std::bind
在表面上看起来很相似,但它是纯粹的绑定。它不允许您动态创建表达式,因为它不会使任何相关类型的任何运算符超载。