如果不使用lambda,我怎么能整齐地创建一个给定表达式的函数?

时间:2012-10-23 23:31:55

标签: c++

希望能够做类似

的事情
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是某个类的一部分,上面代码的当前范围也是如此。

1 个答案:

答案 0 :(得分:1)

Boost Lambda LibraryBoost.BindBoost.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";
}

Live example.

当然,这通过成员指针有明显的缺点。另外,在C ++ 03中,你写出了这样一个“lambda”的类型有一个强大的问题,因为它是一个巨大的模板混乱。上面的小例子将产生一个巨大的名字,可以看出here。由于图书馆解决方案不是“最好的”,标准委员会在语言中加入了lambdas。耶。

请注意,虽然C ++ 11的std::bind在表面上看起来很相似,但它是纯粹的绑定。它不允许您动态创建表达式,因为它不会使任何相关类型的任何运算符超载。