C++14中如何实现所有模板参数同类型的类模板偏特化?
在C++14中实现Generic类模板的偏特化
可以实现这个需求,利用SFINAE和自定义类型 trait 来判断所有模板参数是否为同一类型,进而启用偏特化版本使用std::array。
步骤1:定义判断所有类型是否相同的Trait
首先需要一个辅助类型 trait,用来检查可变参数模板中的所有类型是否一致:
#include <type_traits> template <typename...> struct IsAllSame : std::true_type {}; template <typename T, typename U, typename... Rest> struct IsAllSame<T, U, Rest...> : std::integral_constant<bool, std::is_same<T, U>::value && IsAllSame<T, Rest...>::value> {};
步骤2:实现主模板与偏特化版本
主模板保持原有逻辑使用std::tuple,偏特化版本通过std::enable_if_t结合IsAllSame trait 触发SFINAE,仅当所有参数类型相同时生效,使用std::array作为容器:
#include <tuple> #include <array> // 主模板:参数类型不同时使用tuple template <typename... T> class Generic { public: using Container = std::tuple<T...>; }; // 偏特化版本:所有参数类型相同时使用array template <typename T, typename... Rest> class Generic<T, Rest...> : private std::enable_if_t<IsAllSame<T, Rest...>::value, void> { public: static constexpr std::size_t ContainerSize = 1 + sizeof...(Rest); using Container = std::array<T, ContainerSize>; };
验证代码
以下代码可以验证两种场景的正确性:
int main() { // 不同类型参数:使用tuple static_assert(std::is_same<typename Generic<int, float, char>::Container, std::tuple<int, float, char>>::value, "Mismatch for mixed types"); // 相同类型参数:使用array static_assert(std::is_same<typename Generic<int, int, int>::Container, std::array<int, 3>>::value, "Mismatch for same types"); // 单个参数:同样使用array static_assert(std::is_same<typename Generic<double>::Container, std::array<double, 1>>::value, "Mismatch for single type"); return 0; }
说明
- 这个实现完全基于C14特性,没有使用C20的
constraints、requires或折叠表达式,仅依赖SFINAE、类型 trait 和可变参数模板的基础语法。 - 嵌入式环境中
std::array的栈分配特性符合避免堆内存的要求。
内容的提问来源于stack exchange,提问作者Daniel Varga
相关产品推荐
相关产品推荐

