如何将模板参数包中的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
相关产品推荐
相关产品推荐

