如何不使用辅助函数打印带空格分隔的非类型模板参数包?
可行实现方案
C++17及以上标准可以直接用逗号折叠表达式实现,无需额外辅助函数,提供两种常用写法:
写法1:极简实现(允许末尾带多余空格)
template <int ... N> struct X { static void Check() { ((std::cout << N << ' '), ...); std::cout << std::endl; } };
调用X<1,2>::Check()会输出1 2 ,末尾多一个空格,适合对末尾格式无严格要求的场景。
写法2:无多余空格的标准实现
template <int ... N> struct X { static void Check() { // 处理空参数包场景,不需要可以删除该判断 if constexpr (sizeof...(N) == 0) { std::cout << std::endl; return; } bool first = true; // 仅在非首元素前插入空格 ((first ? (first = false, std::cout << N) : (std::cout << ' ' << N)), ...); std::cout << std::endl; } };
调用X<1,2>::Check()会输出标准的1 2,元素间带空格、无首尾多余空格。
实现原理
以上写法利用了C++17的一元左折叠规则配合逗号运算符,会按参数包的顺序依次执行每个参数对应的输出表达式,无需额外定义辅助函数、也没有额外依赖。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

