Boost Phoenix: привязка к ссылочным элементам структур?

Я хотел бы использовать 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 &, он компилируется нормально. Но со ссылочным элементом я получаю ошибку «указатель на ссылочный элемент является недопустимым».

Пошарив в сети, мне кажется, что мне нужно использовать функцию «ref» Phoenix, но я не могу понять требуемый синтаксис.

Кто-нибудь знает, как заставить это работать для типа int &?


person Chris Kline    schedule 29.08.2010    source источник


Ответы (2)


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

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

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

person mabraham    schedule 03.03.2012