如何使用折叠表达式制作 csv 列表?

问题描述

我想使用可变参数函数创建一个 CSV 列表。
作为一个懒惰的程序员,让它成为一个单行代码会很好,折叠表达式看起来很合适。

以下代码不起作用:

template<typename ...T>
std::string MakeCSV(T&... args) {
    std::stringstream ss;
    (ss << args << "," << ...);
    return ss.str();
}

int main() {
    std::string s1 = "one";
    std::string s2 = "two";

    std::cout << MakeCSV(s1,s2) << std::endl;
    return 0;
}

这给出:

error: binary expression in operand of fold-expression  
 (ss << args << "," << ...);  
  ~~~~~~~~~~~^~~~~~

除了输入列表本身之外,如何向折叠表达式添加额外的参数?

解决方法

(ss << args << "," << ...);改成((ss << args << ","),...);

第一个版本没有解包,因为中间表达式太复杂了,但是第二个可以解包,因为它使用了逗号操作符。更棒的是,这个版本没有把 "," 放在最后。

template<typename ...T>
std::string MakeCSV(const T&... args) {
    std::stringstream ss;
    ((ss << args << ",...);
    return ss.str();
}