You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在可变参数模板函数中无需递归访问可变参数变量

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:24:06