问题描述
我想使用可变参数函数创建一个 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();
}