Как использовать boost.lambda с boost.range для выбора из контейнера? - PullRequest
4 голосов
/ 15 июня 2011

В C # с Linq я бы написал:

myContainer.Select(o => o.myMember);

Я не уверен, какой синтаксис должен быть для C ++ / lambda / range.Я просто пытаюсь адаптировать контейнер некоторого типа объекта к контейнеру строк, чтобы я мог передать его в boost ::gorith :: join.Я пробовал что-то вроде:

using namespace boost::adaptors;
using namespace boost::lambda;
string result = join(myContainer | transformed(_1.myMember), ", ");

Но, очевидно, это не работает, иначе меня бы здесь не было.;)

Я использую преобразованный после чтения: http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/adaptors/reference/transformed.html

Я хочу использовать лямбду вместо отдельной функции для краткости.

1 Ответ

3 голосов
/ 15 июня 2011

operator. не перегружается, поэтому он никогда не может сделать ничего разумного для заполнителя.


Boost.Lambda (и Boost.Phoenix v1 и v2, основанные на Boost.Lambda) реализуют свой собственный протокол result_of, а не протокол TR1 result_of, поэтому функторы Boost.Lambda не будут работать ни с чем, используя boost::result_of или std::tr1::result_of (как это делает Boost.Range).

Тем не менее, Boost.Phoenix v3, выпуск которого запланирован в Boost 1.47, является официальной заменой Boost.Lambda, а реализует протокол TR1 result_of и так же хорошо играет с boost::result_of (и, следовательно, Boost.Range).

Вы можете использовать Boost.Bind вместо Boost.Lambda, в этом случае действует следующее:

transformed(bind(&myObjectType::myMember, _1))

или вы можете использовать Boost.Phoenix v3 вместо Boost.Lambda (либо вытащить Boost.Phoenix из транка сейчас или дождаться Boost 1.47), в этом случае допустим синтаксис Boost.Bind, а также следующая альтернатива :

transformed(_1->*&myObjectType::myMember)
...