0

希望能够做类似的事情

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一个计算结果为真或假的表达式,它返回一个我可以用boost绑定的函数。因此,在上述情况下,magic_creator 将创建一个函数,该函数将返回 true,而与 _1 和 _2 无关。我无法使用 lamdas,因为它对我没有用。有人为此得到什么吗?

PS 假设 callbackMap 是某个类的一部分,上述代码的当前范围也是如此。

4

1 回答 1

1

这实际上是可能的,而且对于Boost Lambda 库Boost.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";
}

活生生的例子。

当然,这具有通过成员指针的明显缺点。此外,在 C++03 中,您在写出这种“lambda”的类型时遇到了很大的问题,因为它是一个巨大的模板混乱。上面的小例子将产生一个巨大的名字,正如可以在这里看到的那样。由于库解决方案不是“最好的”,标准委员会在语言中添加了 lambdas。耶。

请注意,虽然 C++11std::bind表面上看起来很相似,但它是一个纯粹的 binder。它不允许您即时创建表达式,因为它不会为任何相关类型重载任何运算符。

于 2012-10-24T00:27:04.587 回答