二元折叠表达式的多个参数



我正在尝试使用fold表达式而不是模板递归来编写可变模板打印。

目前我有

template <typename... Ts, typename charT, typename traits>
constexpr std::basic_ostream<charT, traits>& many_print(std::basic_ostream<charT, traits>& os, Ts... args){
os << '{';
(os << ... << args);
return os << '}';
}

对于对many_print(1, 2);的调用,输出为{12}

我希望我的输出是{1, 2}

我唯一的一次尝试是

template <typename... Ts, typename charT, typename traits>
constexpr std::basic_ostream<charT, traits>& many_print(std::basic_ostream<charT, traits>& os, Ts... args){
os << '{';
(os << ... << ((void)(os << ", "), args));
return os << '}';
}

这使用逗号运算符为每个参数打印", "。不幸的是,由于排序顺序的原因,逗号打印在arg之前,导致{, 1, 2}

有没有不使用模板递归的解决方案?

我知道有n-1个逗号将是一个问题。如果我能得到输出{1, 2, }的代码,我将不胜感激。

在这种情况下,在没有计算任何内容的情况下,您可以只对折叠本身使用逗号运算符:

((os << args << ", "),...)

使用状态变量技巧,您甚至可以省略一个逗号:

int n=0;
((os << (n++ ? ", " : "") << args),...);

最新更新