2010-08-29 2 views
2

Я хотел бы использовать Boost Phoenix для генерации лямбда-функции для использования в операции std :: find_if в структуре, содержащей элементы ссылочного типа. Надуманный пример заключается в следующем:Boost Phoenix: привязка к ссылкам элементов структуры?

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

Из-за того, что я ткнулся в сеть, мне кажется, что мне нужно использовать функциональность Phoenix 'ref', но я не могу представить необходимый синтаксис.

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

ответ

3

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

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

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