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

如何在C++中使用`type ... pack-name`类型的参数包?

解答

你提到的是非类型模板参数包,它和类型参数包的核心区别是:传入的是一组编译期常量,而非类型。下面是几个常见的实用场景:

1. 编译期数值计算

可以在编译期完成求和、乘积等运算,结果直接作为常量使用:

template<int... Ints>
constexpr int sum() {
    return (Ints + ...); // 折叠表达式求和
}

// 编译期直接得到结果15
constexpr int total = sum<1,2,3,4,5>();

2. 生成固定结构的容器

用参数包指定容器的维度或初始化元素:

#include <array>

template<int... Elems>
constexpr auto make_array() {
    return std::array<int, sizeof...(Elems)>{Elems...};
}

// 生成一个包含{2,4,6,8}的数组,编译期初始化
constexpr auto even_nums = make_array<2,4,6,8>();

3. 批量实例化模板

利用参数包展开,一次性实例化多个模板类/结构体:

#include <iostream>

template<int N>
struct LogNumber {
    LogNumber() {
        std::cout << "Number: " << N << "\n";
    }
};

template<int... Ints>
void log_all() {
    // 逗号表达式折叠,依次实例化每个LogNumber
    (LogNumber<Ints>{}, ...);
}

// 调用后会依次输出每个数字的日志
log_all<10,20,30>();

4. 编译期合法性校验

用参数包定义允许的常量集合,在编译期判断输入是否合法:

template<int... Allowed, int Input>
constexpr bool is_valid() {
    return ((Input == Allowed) || ...); // 折叠表达式判断是否匹配任一允许值
}

// 编译期判断7是否在{3,5,7,11}中,结果为true
constexpr bool valid = is_valid<3,5,7,11, 7>();

5. 传递编译期配置

比如给函数传递一组编译期确定的配置参数,无需运行时开销:

template<int MaxSize, int Align, int Flags>
void configure_buffer() {
    // 使用编译期常量做配置,无运行时计算
    char buffer[MaxSize] __attribute__((aligned(Align)));
    // 根据Flags做不同初始化逻辑
    if constexpr (Flags & 1) {
        // 初始化逻辑1
    } else {
        // 初始化逻辑2
    }
}

// 调用时直接传入编译期常量
configure_buffer<1024, 16, 3>();

内容的提问来源于stack exchange,提问作者a_girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:55:15