开发者

Boost Phoenix: Binding to reference members of structures?

开发者 https://www.devze.com 2023-01-13 08:20 出处:网络
I would like to use Boost Phoenix to generate a lambda function for use in a std::find_if operation on a structure that contains reference-type members. A contrived example is as follow开发者_运维问答

I would like to use Boost Phoenix to generate a lambda function for use in a std::find_if operation on a structure that contains reference-type members. A contrived example is as follow开发者_运维问答s:

 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
  );

If MyStruct::x is of type int instead of int&, it compiles fine. But with the reference member I get a "pointer to reference member is illegal" error.

From poking around on the net, it seems like I need to use Phoenix's 'ref' functionality, but I can't seem to figure out the required syntax.

Does anyone know how to get this to work for type 'int&' ?


Sorry that this is far too late, but for future reference, you can use a member pointer:

std::vector<MyStruct>::const_iterator it =
    find_if(AllStructs.begin(), AllStructs.end(),
        (&boost::phoenix::arg_names::arg1)->*&MyStruct::x == 5
    );


You cannot create a pointer to a reference member, just as you cannot create a pointer to a reference. The answer from Daniel James could work only if x was a plain int, rather than int&. See phoenix.modules.operator.member_pointer_operator also.

0

精彩评论

暂无评论...
验证码 换一张
取 消