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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:53:35