代码之家  ›  专栏  ›  技术社区  ›  Chris Kline

Boost Phoenix:绑定到结构的参考成员?

  •  2
  • Chris Kline  · 技术社区  · 14 年前

    我想使用BoostPhoenix生成一个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&”?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Daniel James John Zwinck    14 年前

    抱歉,这太晚了,但为了将来参考,您可以使用成员指针:

    std::vector<MyStruct>::const_iterator it =
        find_if(AllStructs.begin(), AllStructs.end(),
            (&boost::phoenix::arg_names::arg1)->*&MyStruct::x == 5
        );
    
        2
  •  1
  •   mabraham Frahm    13 年前

    不能创建指向引用成员的指针,就像不能创建指向引用的指针一样。丹尼尔·詹姆斯的回答只有在x是一个简单的int,而不是int&的情况下才有效。见 phoenix.modules.operator.member_pointer_operator 也。