【问题标题】:Pass template function to transform without lambda将模板函数传递给没有 lambda 的转换
【发布时间】:2015-06-02 06:29:51
【问题描述】:

我目前有c++11的功能:

template<class IteratorIn>
std::string to_string_join(IteratorIn first, IteratorIn last, std::string joiner) {

    std::vector<std::string> ss(last - first);

    std::transform(
        first, last, begin(ss),
        [](typename std::iterator_traits<IteratorIn>::value_type d) {
            return std::to_string(d);
        }
    );

    return boost::algorithm::join(ss, joiner);
}

可以这样使用:

std::vector<int> is{-1, 2, 62, 4, -86, 23, 8, -0,2};

std::cout << to_string_join(begin(is), end(is), ", ") << std::endl;

输出:

"-1, 2, 62, 4, -86, 23, 8, 0 ,2".

我在另一篇 SO 帖子 "convert-vectordouble-to-vectorstring-elegant-way" 中读到不需要 lambda。但是我无法实现删除 lambda。

我怀疑它应该看起来像这样:

std::transform(
    first, last, begin(ss),
    std::to_string<typename std::iterator_traits<IteratorIn>::value_type>
);

导致编译错误:

“错误:在‘>’标记之前需要‘(’”。

如何在没有 lambda 的情况下传递 to_string?

【问题讨论】:

    标签: c++ templates c++11 lambda


    【解决方案1】:

    出现错误是因为std::to_string 不是函数模板。您正在寻找 static_cast,而不是模板参数。

    std::transform(
        first, last, begin(ss),
        static_cast<std::string(*)(typename std::iterator_traits<IteratorIn>::value_type)>(std::to_string)
    );
    

    【讨论】:

    • 你说得对,很可惜它这么乱。谢谢。
    • @JulianAustralia 是的,很乱;坚持使用 lambda。
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多