1

有:

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 >, tuple >, int (CWorm::*const)() const, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type> >::sig >::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)))
4

2 回答 2

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 函数。

于 2012-01-11T04:59:55.843 回答
0

引用自Boost.Lambda文档:

包含函数调用、控制结构、强制转换等的 Lambda 表达式需要特殊的语法结构。最重要的是,函数调用需要包装在绑定函数中。例如,考虑 lambda 表达式

您正在尝试在代码中调用一个函数,因此您必须使用bind()实际延迟函数的调用。此外,延迟变量/常量 也更干净forworm

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

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

于 2012-01-11T18:38:53.810 回答