如何在C++中存储std::size_t类型的可变模板参数?
如何存储并复用std::size_t类型的可变模板参数?
你尝试直接用using example = 10, 12, 3;存储可变模板参数的写法是非法的——using只能定义类型别名,而10,12,3是数值,不是类型。要实现复用参数包的需求,需要用模板类型来包裹这组数值,以下是几种可行方案:
方案1:利用标准库的std::index_sequence(C++11及以上)
std::index_sequence是标准库提供的用于包裹std::size_t类型参数包的模板,我们可以基于它实现参数包的存储与复用:
#include <iostream> #include <utility> // 引入std::index_sequence // 原有的递归打印函数 template<std::size_t st> void print_sizes(){ std::cout << st << std::endl; } template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(){ std::cout << st << std::endl; print_sizes<M, Rest...>(); } // 新增重载:接受index_sequence,展开参数包调用原函数 template<std::size_t... Sizes> void print_sizes(std::index_sequence<Sizes...>) { print_sizes<Sizes...>(); } // 用index_sequence存储目标参数包 using example = std::index_sequence<10, 12, 3>; int main(){ print_sizes(example{}); // 传递index_sequence实例触发调用 }
方案2:自定义模板结构体存储参数包
如果不想依赖标准库的index_sequence,可以自己定义一个简单的模板结构体来包裹参数:
#include <iostream> // 自定义用于存储std::size_t参数包的结构体 template<std::size_t... Sizes> struct SizeList {}; // 适配SizeList的打印函数 template<std::size_t st> void print_sizes(SizeList<st>) { std::cout << st << std::endl; } template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(SizeList<st, M, Rest...>) { std::cout << st << std::endl; print_sizes(SizeList<M, Rest...>()); } // 存储目标参数包 using example = SizeList<10, 12, 3>; int main(){ print_sizes(example{}); }
方案3:通过模板转发实现<example>式调用
如果希望保持类似print_sizes<example>()的调用形式,可以借助辅助模板类实现参数包转发:
#include <iostream> // 原有的递归打印函数 template<std::size_t st> void print_sizes(){ std::cout << st << std::endl; } template<std::size_t st, std::size_t M, std::size_t... Rest> void print_sizes(){ std::cout << st << std::endl; print_sizes<M, Rest...>(); } // 自定义参数包存储结构体 template<std::size_t... Sizes> struct SizePack {}; // 辅助模板类:负责展开SizePack中的参数包 template<typename Pack> struct PrintHelper; template<std::size_t... Sizes> struct PrintHelper<SizePack<Sizes...>> { static void run() { print_sizes<Sizes...>(); } }; // 存储目标参数包 using example = SizePack<10, 12, 3>; int main(){ PrintHelper<example>::run(); // 间接实现类似print_sizes<example>()的效果 }
内容的提问来源于stack exchange,提问作者Sam Moldenha
相关产品推荐
相关产品推荐

