Повышение Феникс: привязка к ссылкам членов структур? - PullRequest
2 голосов
/ 30 августа 2010

Я хотел бы использовать 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 &'?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2011

Извините, что это слишком поздно, но для дальнейшего использования вы можете использовать указатель члена:

std::vector<MyStruct>::const_iterator it =
    find_if(AllStructs.begin(), AllStructs.end(),
        (&boost::phoenix::arg_names::arg1)->*&MyStruct::x == 5
    );
1 голос
/ 03 марта 2012

Вы не можете создать указатель на ссылочный элемент, так же, как вы не можете создать указатель на ссылку. Ответ от Даниэля Джеймса мог бы сработать, только если x было простым int, а не int &. См. Также phoenix.modules.operator.member_pointer_operator .

...