boost :: phoenix :: sort sort - PullRequest
       33

boost :: phoenix :: sort sort

0 голосов
/ 08 ноября 2011

Я пытаюсь отсортировать вектор ниже, используя библиотеку boost :: phoenix.Класс Foo имеет функцию-член int getvalue ().Цель состоит в том, чтобы отсортировать вектор, используя значение, возвращаемое функцией getvalue ().Но чего-то не хватает.Я получаю сообщение об ошибке компилятора, так как ':: second не является классом или пространством имен'

      std::vector<std::pair<int, Foo> > fooVec;

      boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second::getvalue(), boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );

Может кто-нибудь объяснить это.Какие изменения мне нужны для этой работы?

Спасибо.

PS: я знаю, что мог использовать функцию object / lambda или что-то подобное, но я хотел попробовать boost :: phoenix.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Как уже отмечалось, я не думаю, что ваш способ создания актера Феникса из вашего вектора можно использовать для его сортировки, но я никогда не использовал алгоритмы из Феникса, поэтому я не уверен в этом.Вы, конечно, можете использовать сортировку и создать функтор с фениксом для его сортировки.
Поэтому я бы предложил использовать феникс таким образом.

boost::phoenix::sort(boost::phoenix::placeholders::arg1, boost::phoenix::placeholders::arg2)(fooVec, 
        boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg1)) < boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg2))
        );
2 голосов
/ 08 ноября 2011

Это только то, что написано в сообщении об ошибке.std::pair<int, Foo>::second является членом данных, а не классом или пространством имен, поэтому вы не можете использовать оператор :: для него.

Вместо second вы можете использовать second_type, то есть typedefдля типа второго элемента в паре:

boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );
...