C++模板参数包如何获取所有类型sizeof的最大值
方案1:C++17及更高版本(最简洁)
借助C++17的初始化列表重载的std::max和constexpr lambda,可以直接在结构体内部实现:
#include <algorithm> #include <cstddef> template<class...T> struct Data { // 空参数包时默认返回0,可根据需求调整返回值 static constexpr std::size_t max_size = []() constexpr { if constexpr (sizeof...(T) == 0) { return std::size_t{0}; } else { return std::max({sizeof(T)...}); } }(); };
方案2:兼容C++11/14版本
没有C++17特性的场景下,可以用模板递归实现编译期最大值计算:
#include <cstddef> // 编译期求参数包最大值的辅助模板 template<std::size_t... Sizes> struct MaxSize; // 空参数包特化(可选,根据需求调整返回值) template<> struct MaxSize<> { static constexpr std::size_t value = 0; }; // 递归终止:只剩一个数值 template<std::size_t Size> struct MaxSize<Size> { static constexpr std::size_t value = Size; }; // 递归逻辑:每次取前两个的最大值,和剩余数值继续计算 template<std::size_t First, std::size_t Second, std::size_t... Rest> struct MaxSize<First, Second, Rest...> { static constexpr std::size_t value = MaxSize<(First > Second ? First : Second), Rest...>::value; }; // 在Data结构体中使用 template<class...T> struct Data { static constexpr std::size_t max_size = MaxSize<sizeof(T)...>::value; };
注意事项
- 两种方案都支持空参数包的情况,默认返回0,可根据业务需求修改空包时的返回值
- 计算得到的
max_size是编译期常量,可以直接用在静态数组大小、alignas声明等需要编译期常量的场景 - 如果使用场景需要同时考虑类型的对齐要求,可以用同样的逻辑计算
alignof(T)...的最大值配合使用
内容的提问来源于stack exchange,提问作者Iter Ator
相关产品推荐
相关产品推荐

