2

私はこのようなクラスを持っています

class Foo {
    public:
        int GetID() const { return m_id; }
    private:
        int m_id;
};

次のように、Foo オブジェクトでいっぱいのベクターで find_if を使用したいと考えています。

std::find_if(foos.begin(), foos.end(), ???.GetID() == 42);

???の代わりに何を書かなければならないのかよくわかりません。boost::lambda の _1 または boost::phoenix の arg1 があることは知っていますが、その後は途方に暮れています。

編集:

多くの例でこのように見たにもかかわらず、機能しない次のことを試しました。

std::find_if(foos.begin(), foos.end(), boost::lambda::bind(&Foo::GetID, boost::lambda::_1) == 42);

次に、次のエラーが表示されます。

エラー C2678: バイナリ '==' : 型 'const boost::lambda::lambda_functor' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

4

1 に答える 1

4

この場合に使用boost::bindします。これは、C++11 より前の最も簡単な方法です。

std::find_if(foos.begin(), foos.end(), boost::bind(&Foo::GetId, _1) == 42);

使用する必要がある場合は、使用phoenixできますphoenix::bind

std::find_if(foos.begin(), foos.end(),
phx::bind(&Foo::GetId, phx::placeholders::_1) == 42);

どこphxですか

namespace phx = boost::phoenix;

C++11 を使用できる場合 -std::bindまたはラムダ関数を使用できます

std::find_if(foos.begin(), foos.end(), 
[](const Foo& f) { return f.GetId() == 42; });
于 2015-09-03T12:41:54.023 に答える