通过boost :: algorithm :: join和boost :: adapters :: transformed转换boost.asio :: ip :: address的std :: vector

时间:2014-10-21 08:28:53

标签: c++ boost functional-programming

简短的问题。我不知道如何正确使用boost::adaptors::transformedboost::algorithm::join。以下不起作用:

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

我不理解boost::adaptors::transformed的语法。如何为std::vector中的每个对象调用memeber函数?

目前我手动连接字符串,但我更喜欢上面概述的功能方法。

感谢。

2 个答案:

答案 0 :(得分:4)

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,更喜欢lambda语法:

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

答案 1 :(得分: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();
            }),
    ", "))