如何在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
相关产品推荐
相关产品推荐

