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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:36:02