2

我想使用 Boost Phoenix 生成一个 lambda 函数,用于对包含引用类型成员的结构进行 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

您无法创建指向引用成员的指针,就像您无法创建指向引用的指针一样。丹尼尔詹姆斯的答案只有在 x 是一个普通的 int 而不是 int& 时才有效。另请参见phoenix.modules.operator.member_pointer_operator

于 2012-03-03T06:18:47.053 回答