C++ 的问题boost lambda 和 == 运算符

发布于 2024-12-26 12:22:51 字数 1315 浏览 3 评论 0 原文

有:

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 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)))

There is:

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

And:

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

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

Then I have this call (which errors):

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

And worms() returns a Ref<Iterator<CWorm*> Ref> and there is int CWorm::getID(); (which is a member function).

This fails with a very lengthy error about invalid operands to binary expression. Part of it:

/usr/local/include/boost/lambda/detail/operator_lambda_func_base.hpp:222:1:{222:1-222:63}{222:1-222:63}: error: invalid operands to binary expression ('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' (aka 'member_pointer_caller') and 'int') [3]

Why?

How can I fix it?

If I do it somewhat more verbose, i.e. not via lambdas but I declare another function manually and use boost::bind, it works. I.e. like this:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

此刻的回忆 2025-01-02 12:22:51

您应该能够执行此操作:

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

You should be able to do this:

#include <boost/lambda/bind.hpp>

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

The boost::lambda::bind(&CWorm::getID, _1) behaves just as you hoped (_1 ->* &CWorm::getID) would, and can (lazily) compare for equality against forworm. So it's still very much a lambda function.

晨曦慕雪 2025-01-02 12:22:51

引用 Boost.Lambda 文档:

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

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

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

这个答案是对 @Aaron McDaid 答案的增强,它对于一个人来说太长了 评论。

Quote from Boost.Lambda documentation:

Lambda expressions containing function calls, control structures,
casts etc. require special syntactic constructs. Most importantly,
function calls need to be wrapped inside a bind function. As an
example, consider the lambda expression

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/constant forworm:

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

This answer is an enhancement of @Aaron McDaid's answer, it just got too long for a comment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文