如何在可变参数模板函数中无需递归访问可变参数变量
C++ 非递归实现printall可变参数打印函数
你给出的参考代码中的写法无法通过编译,C++的可变参数包是编译期实体,不能通过运行期的for循环下标直接访问。以下是两种符合要求的非递归实现方案:
方案1:兼容C++11/14 初始化列表展开法
借助初始化列表在编译期展开参数包,配合逗号表达式实现逐个打印:
#include <iostream> template <class... Ts> void printall(Ts... in_vars) { // 初始化列表展开参数包,每个参数对应执行一次输出逻辑 int dummy[] = { 0, (std::cout << in_vars << " ", 0)... }; // 消除dummy变量未使用的编译警告 (void)dummy; }
逻辑说明:初始化列表展开时,每个参数都会执行逗号表达式(std::cout << in_vars << " ", 0),先完成打印操作,再返回整数0作为数组的初始化元素。开头补的0用于兼容参数包为空的边界场景,避免出现长度为0的非法数组定义。
方案2:C++17及以上 折叠表达式简化写法
C++17引入的折叠表达式语法可以进一步简化实现,无需额外辅助变量:
#include <iostream> template <class... Ts> void printall(Ts... in_vars) { // 逗号运算符左折叠,依次执行每个参数的打印逻辑 ((std::cout << in_vars << " "), ...); }
测试用例
int main() { printall(1, 3.14, "test string", 'A'); return 0; }
运行输出:1 3.14 test string A
内容的提问来源于stack exchange,提问作者jojo_Aero_smith_the_dummy
相关产品推荐
相关产品推荐

