C ++的问题提升lambda和== - 运算符

时间:2012-01-11 04:14:31

标签: c++ templates boost boost-lambda

有:

template<typename T>
bool any(::Ref<Iterator<T> > i, boost::function<bool(T)> pred) {
    // ...
}

template<typename T> struct Ref {
     // ...
};

template<typename T> struct Iterator {
     // ...
};

然后我有这个电话(错误):

int forworm = 42;
bool x = any<CWorm*>(worms(), (_1 ->* &CWorm::getID) == forworm)

并且worms()返回Ref<Iterator<CWorm*> Ref>并且int CWorm::getID();(这是一个成员函数)。

这失败了,关于二进制表达式的无效操作数有很长的错误。部分原因:

  

/usr/local/include/boost/lambda/detail/operator_lambda_func_base.hpp:222:1:{222:1-222:63} {222:1-222:63}:错误:二进制表达式的操作数无效('typename lambda_functor_base&gt;,tuple&gt;,int(CWorm :: * const)()const,null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type&gt;&gt; :: sig&gt; :: type' (又名'member_pointer_caller')和'int')[3]

为什么?

我该如何解决?

如果我这样做更冗长,即不通过lambdas,但我手动声明另一个函数并使用boost::bind,它可以工作。即像这样:

static bool _wormIdEqual(CWorm* w, int wormId) {
    return w->getID() == wormId;
}

any<CWorm*>(worms(), boost::bind(_wormIdEqual, _1, forworm)))

2 个答案:

答案 0 :(得分:2)

你应该可以这样做:

#include <boost/lambda/bind.hpp>

using boost::lambda::bind;
bool x = any<CWorm*>(worms(), bind(&CWorm::getID, _1) == forworm);

boost::lambda::bind(&CWorm::getID, _1)的行为与您希望(_1 ->* &CWorm::getID)一样,并且可以(懒惰地)比较与forworm的平等。所以它仍然是一个lambda函数。

答案 1 :(得分:0)

引自Boost.Lambda文档:

  

包含函数调用,控制结构的Lambda表达式   演员等需要特殊的句法结构。最重要的是,   函数调用需要包含在绑定函数中。作为一个   例如,考虑lambda表达式

您正尝试在代码中调用函数,因此必须使用bind()来实际推迟调用函数。此外,它对delay the variable/constant forworm来说也更清晰:

int forworm = 42;
bool x = any<CWorm*>(worms(), bind(&CWorm::getID, _1) == var(forworm));

这个答案是@Aaron McDaid的答案的增强,它的评论时间太长了。