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]

なんで?

どうすれば修正できますか?

ラムダを介さずに、もう少し冗長にすると、別の関数を手動で宣言して使用する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ます。したがって、それはまだ非常にラムダ関数です。

于 2012-01-11T04:59:55.843 に答える
0

Boost.Lambdaドキュメントからの引用:

関数呼び出し、制御構造、キャストなどを含むLambda式には、特別な構文構造が必要です。最も重要なことは、関数呼び出しをバインド関数内にラップする必要があることです。例として、ラムダ式を考えてみましょう

コードで関数を呼び出そうとしているので、bind()関数の呼び出しを実際に延期するために使用する必要があります。さらに、変数/定数 を遅らせることもよりクリーンですforworm

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

この回答は@AaronMcDaidの回答を拡張したものであり、コメントするには長すぎます。

于 2012-01-11T18:38:53.810 に答える