2009-08-28 5 views
9

私はstd :: vectorを持っており、各要素の特定の属性 をチェックしたいと思います。 SomeStructには属性 'type'があります。この属性 がType1かType2のいずれかであることを確認します。boost :: lambdaとstd :: find_ifを併用するには?

私の計画は、boost :: lambdaを使用することです。

std::vector<SomeStruct>::const_iterator it = 
    std::find_if(
     vec.begin(), vec.end(), 
     _1.type == SomeStruct::Type1 || _1.type == SomeStruct::Type2); 

私は各要素の特定の属性にアクセスする必要があるので、私は 使用ブースト::まったくラムダをできるなら、私はわかりません。

ヒント

答えて

10
std::find_if(
    vec.begin(), vec.end(), 
    bind(&SomeStruct::type, _1) == SomeStruct::Type1 || 
    bind(&SomeStruct::type, _1) == SomeStruct::Type2); 
+0

これは完璧ですが、なぜ動作するのかわかりません。また、私をさらに混乱させる(&SomeStruct :: func、_1)(ここでfuncは関数です)をバインドすると同じように動作します。 – yhager

+0

@yhager 'bind(&SomeStruct :: type、type1)'は、 '_1'がプレースホルダーであるオブジェクトに対して' .type'を実行した結果を表すブーストラムダを与えます。詳細については[バインドのドキュメントを参照](http://www.boost.org/doc/libs/1_50_0/doc/html/lambda/le_in_details.html#lambda.bind_expressions)を参照してください。 – sepp2k

1

あなたの表現は、あなたの表現は、それは単にブーストで定義されたオブジェクト_1のメンバーtypeに言及だ、ラムダ式として動作することはできませんので、ドット演算子をオーバーロードすることはできませんので

_1.type 

でコンパイルされません。 :: lambda.hpp。さて、私は_1タイプが何であるかわからないし、このタイプについて考えると私は震えます。それは私たちにとって、それを知っている人間にとってではありません:-)。
適切な表現はsepp2kによって与えられます。

+0

'_1'の型は' boost :: lambda :: placeholder1_type'です。 – sepp2k

関連する問題