c++ - 用字符串及其大小折叠表达式

标签 c++ c++17 variadic-templates fold-expression

我有这样的 C++14 代码。

我正在更新到 C++17。有没有办法将其重写为折叠表达式?

namespace cat_impl_{
    inline size_t catSize(std::string_view const first) {
        return first.size();
    }

    template<typename... Args>
    size_t catSize(std::string_view const first, Args &&... args) {
        return catSize(first) + catSize(std::forward<Args>(args)...);
    }

    inline void cat(std::string &s, std::string_view const first) {
        s.append(first.data(), first.size());
    }

    template<typename... Args>
    void cat(std::string &s, std::string_view const first, Args &&... args) {
        cat(s, first);
        cat(s, std::forward<Args>(args)...);
    }
}

template<typename... Args>
std::string concatenate(Args &&... args){
    // super cheap concatenation,
    // with single allocation

    using namespace cat_impl_;

    size_t const reserve_size = catSize(std::forward<Args>(args)...);

    std::string s;

    s.reserve(reserve_size);

    cat(s, std::forward<Args>(args)...);

    return s;
}

最佳答案

是的

template <typename... Args>
std::size_t catSize (Args &&... args) {
    return (... + std::forward<Args>(args).size());
}

template <typename... Args>
void cat (std::string &s, Args ... args) {
    (s.append(args.data(), args.size()), ...);
}

或者也(更通用,不仅适用于 std::string_view )

template <typename ... Args>
void cat (std::string &s, Args && ... args) {
    (s += std::forward<Args>(args), ...);
}

或者,也许,你可以完全避免 cat()catSize()并简单地写一些东西

template <typename... Args>
std::string concatenate (Args &&... args) {

    std::string s;

    s.reserve((args.size() + ...));

    return (s += std::forward<Args>(args), ...);
}

题外话:避免双重std::forward ,对于同一个对象,在函数中(请参阅原始 std::forward 中的 args 上的双 concatenate() )。

关于c++ - 用字符串及其大小折叠表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402766/

相关文章:

c++ - 模板类中的可变参数模板构造函数专门化

c++ - 打包任务参数是否存在数据竞争?

c++ - 编译简单类函数的无法解释的错误? C++

c++ - 将特定字符串添加到核心转储到它的开头

c++ - 结构根据空基类顺序更改大小

c++ - 如果不允许 constexpr,为什么 sfinae on?

c++ - 如何在模板中转发左右值引用

c++ - 从 const rvalue move

c++ - std::visit 的 C++17 示例中令人困惑的模板

c++ - 模板模板参数和默认值