【问题标题】:Boost Phoenix: Binding to reference members of structures?Boost Phoenix:绑定到结构的引用成员?
【发布时间】:2010-08-29 21:36:57
【问题描述】:

我想使用 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&' ?

【问题讨论】:

    标签: struct reference member boost-phoenix c++


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您无法创建指向引用成员的指针,就像您无法创建指向引用的指针一样。只有当 x 是一个普通的 int 而不是 int& 时,Daniel James 的答案才有效。另见phoenix.modules.operator.member_pointer_operator

      【讨论】:

        猜你喜欢
        • 2020-08-27
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        相关资源
        最近更新 更多