【问题标题】:Transform a std::vector of boost.asio::ip::address via boost::algorithm::join and boost::adaptors::transformed通过 boost::algorithm::join 和 boost::adaptors::transformed 转换 boost.asio::ip::address 的 std::vector
【发布时间】:2014-12-16 09:49:48
【问题描述】:

简短的问题。我不知道如何正确使用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函数?

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

谢谢。

【问题讨论】:

    标签: c++ boost functional-programming


    【解决方案1】:

    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(); }), ", ");
    

    【讨论】:

    • 非常感谢。信息:我只能使用启用了BOOST_RESULT_OF_USE_DECLTYPE 预处理器宏的 C++11 版本。我正在使用 GCC 4.7.1 和 Boost 1.49.0。
    【解决方案2】:

    @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();
                }),
        ", "))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2013-10-25
      • 2021-03-21
      • 1970-01-01
      • 2021-08-18
      • 2014-10-15
      相关资源
      最近更新 更多