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

如何将模板参数包中的std::size_t参数求和以定义数组大小

C++模板参数包求和定义数组大小

你写的这段代码里,用N + ...这种折叠表达式的方式完全正确,这是C++17及以后版本里最简洁的实现方法。折叠表达式会自动展开模板参数包N...,把所有传入的std::size_t参数逐个相加,最终的总和就会作为std::array的模板参数(也就是数组的固定大小)。

完整可运行代码示例

#include <array>

template<typename T, std::size_t... N>
class Example {
public:
    // 用折叠表达式求和,作为数组的大小
    std::array<T, (N + ...)> data;
};

// 使用示例
int main() {
    Example<int, 2, 3, 5> ex;
    // ex.data的大小是2+3+5=10,编译期就能确定
    static_assert(ex.data.size() == 10);
    return 0;
}

这里给折叠表达式加了括号,虽然单运算符的折叠表达式可以省略括号,但加上之后在复杂场景下更不容易出错,可读性也更好。

要是需要兼容C++17之前的版本

可以用递归模板来实现求和逻辑:

#include <array>

// 递归终止的基础模板
template<std::size_t...>
struct SumHelper {
    static constexpr std::size_t value = 0;
};

// 递归展开参数包的模板
template<std::size_t First, std::size_t... Rest>
struct SumHelper<First, Rest...> {
    static constexpr std::size_t value = First + SumHelper<Rest...>::value;
};

template<typename T, std::size_t... N>
class Example {
public:
    std::array<T, SumHelper<N...>::value> data;
};

// 使用示例
int main() {
    Example<int, 2, 3, 5> ex;
    static_assert(ex.data.size() == 10);
    return 0;
}

这种方式通过递归模板逐步累加参数包中的每个值,最后得到总和,在C++11及以后都能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:55:20