有:
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)))
答案 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的答案的增强,它的评论时间太长了。