2

Boost Phoenix を使用して、参照型メンバーを含む構造体の std::find_if 操作で使用するラムダ関数を生成したいと考えています。考案された例は次のとおりです。

 struct MyStruct 
 { 
  MyStruct() : x(0) {} 
  int& x;
  };

 std::vector<MyStruct> AllStructs;

 // Search the array for an element for which x == 5
 const std::vector<MyStruct>::const_iterator& it = 
  find_if(
   AllStructs.begin(), 
   AllStructs.end(), 
   bind(&MyStruct::x, arg1) == 5
  );

MyStruct::x が int& ではなく int 型の場合、正常にコンパイルされます。しかし、参照メンバーを使用すると、「参照メンバーへのポインターは不正です」というエラーが表示されます。

ネットで調べてみると、Phoenix の「ref」機能を使用する必要があるようですが、必要な構文がわかりません。

これをタイプ 'int&' で機能させる方法を知っている人はいますか?

4

2 に答える 2

4

これが遅すぎて申し訳ありませんが、将来の参考のために、メンバーポインターを使用できます。

std::vector<MyStruct>::const_iterator it =
    find_if(AllStructs.begin(), AllStructs.end(),
        (&boost::phoenix::arg_names::arg1)->*&MyStruct::x == 5
    );
于 2011-02-27T20:04:36.173 に答える
1

参照へのポインターを作成できないのと同様に、参照メンバーへのポインターも作成できません。Daniel James からの回答は、x が int& ではなく単純な int である場合にのみ機能します。phoenix.modules.operator.member_pointer_operatorも参照してください。

于 2012-03-03T06:18:47.053 に答える