2014-10-21 1 views
1

короткий вопрос. Я не знаю, как правильно использовать boost::adaptors::transformed с boost::algorithm::join. Ниже не работает:Преобразование std :: vector boost.asio :: ip :: адрес через boost :: algorithm :: join и boost :: адаптеры :: преобразованные

boost::algorithm::join(addresses | 
         boost::adaptors::transformed(std::mem_f(&boost::asio::ip::address_v4::to_string)), ", "); 

Я не понимаю синтаксис boost::adaptors::transformed. Как вызвать функцию memeber для каждого объекта в std::vector?

В настоящее время im конкатенация строки вручную, но я бы предпочел функциональный подход, описанный выше.

Спасибо.

ответ

3

to_string имеет перегрузкам, поэтому вам нужно указать, какой вы хотите (использовать static_cast)

boost::algorithm::join(
     addresses | 
     transformed(std::mem_fn(static_cast<std::string (address_v4::*)() const>(&boost::asio::ip::address_v4::to_string))), ", "); 

Смотреть это Live On Coliru

Заметим также, что to_string() в этой перегрузки может бросить.


В C++ 11, предпочитаю синтаксис лямбда:

boost::algorithm::join(
     addresses | 
     transformed([](address_v4 const& a) { return a.to_string(); }), ", "); 
+0

Большое спасибо. Info: Я смог использовать версию C++ 11 с включенным макросом препроцессора 'BOOST_RESULT_OF_USE_DECLTYPE'. Я использую GCC 4.7.1 и Boost 1.49.0. –

0

@ ответ sehe является абсолютно правильным. Я просто хотел бы добавить, что один может понадобиться использовать базовый класс boost::asio::ip::address вместо специализации boost::asio::ip::address_v4, выполнив следующие действия:

boost::algorithm::join(
    addresses | 
     boost::adaptors::transformed(
      [](boost::asio::ip::address const &kIpAddress) { 
       return kIpAddress.to_string(); 
      }), 
    ", ")) 
Смежные вопросы