C++ 的问题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
并且有 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]
为什么?
我该如何修复它?
如果我做得更详细一些,即不是通过 lambda,而是手动声明另一个函数并使用 boost::bind,它就可以工作。即像这样:
static bool _wormIdEqual(CWorm* w, int wormId) {
return w->getID() == wormId;
}
any<CWorm*>(worms(), boost::bind(_wormIdEqual, _1, forworm)))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您应该能够执行此操作:
boost::lambda::bind(&CWorm::getID, _1)
的行为正如您所希望的(_1 ->* &CWorm ::getID)
会并且可以(懒惰地)与forworm
进行比较。所以它在很大程度上仍然是一个 lambda 函数。You should be able to do this:
The
boost::lambda::bind(&CWorm::getID, _1)
behaves just as you hoped(_1 ->* &CWorm::getID)
would, and can (lazily) compare for equality againstforworm
. So it's still very much a lambda function.引用 Boost.Lambda 文档:
您正尝试在代码中调用函数,因此必须使用
bind()
来实际延迟函数的调用。此外,延迟变量也更干净/constantforworm
:这个答案是对 @Aaron McDaid 答案的增强,它对于一个人来说太长了 评论。
Quote from Boost.Lambda documentation:
You are trying to invoke a function in your code so you must use
bind()
to actually defer the calling of the function. Moreover, it's also cleaner to delay the variable/constantforworm
:This answer is an enhancement of @Aaron McDaid's answer, it just got too long for a comment.