如何使用std::print打印C++模板参数包?
用std::print打印模板参数包的实现方案
能否用std::print打印模板参数包?比如下面的代码中,???处不知道该用什么构造来实现打印需求:
void func(auto... args){ std::print("???", args...); }
补充说明:func()的其他功能和这个std::print调用无关,期望调用func(a, b, c)时,效果等价于直接调用std::print("{}{}{}", a, b, c)。
可行实现方案(感谢@Passer By)
通过拆分首个参数与剩余参数,结合折叠表达式来实现参数包的打印,同时保证后续参数能正常转发给实际业务逻辑函数:
// 处理参数实际业务逻辑的函数 auto func1(auto&&...args){/*...*/return 0;} auto func0(auto&& arg, auto&&...args){ // 打印参数包(此处不使用std::forward,因为后续还要用到参数) std::print("{}", "args("); std::print("{}", arg); // 打印第一个参数 (std::print(", {}", args), ...); // 用折叠表达式展开打印剩余参数 std::println(")"); // 将参数转发给实际业务函数 return func1(std::forward<decltype(arg)>(arg), std::forward<decltype(args)>(args)...); } // 调用示例 func0(1); // 输出: args(1) func0(2, "abc"); // 输出: args(2, abc)
说明:该方案通过分离首个参数避免空参数包的问题,用折叠表达式(std::print(", {}", args), ...)依次打印剩余参数,同时通过std::forward保证参数的值类别(左值/右值)在转发到业务函数时不变。
内容的提问来源于stack exchange,提问作者Solo
相关产品推荐
相关产品推荐

