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

C++模板类编译期类型校验及对应容器自动添加实现方案

解决方案

要实现需求,需完成两个核心目标:编译期类型合法性校验和根据模板类型自动将对象指针加入对应容器,以下是基于C++标准特性的两种实现方案:

方案一:C++17及以上版本(简洁高效)

利用static_assert做编译期类型校验,结合constexpr if实现编译期分支判断,避免运行时开销:

#include <vector>
#include <string>
#include <type_traits>

// 全局容器,存储对应类型的myClass指针
std::vector<class myClass<int>*> intVec;
std::vector<class myClass<float>*> floatVec;
std::vector<class myClass<std::string>*> stringVec;

template<typename T>
struct myClass
{
    T value;

    myClass()
    {
        // 编译期校验:仅允许int、float、std::string类型
        static_assert(
            std::disjunction_v<std::is_same<T, int>, 
                               std::is_same<T, float>, 
                               std::is_same<T, std::string>>,
            "myClass only supports int, float, or std::string types"
        );

        // 编译期分支,根据类型推入对应容器
        if constexpr (std::is_same_v<T, int>)
        {
            intVec.push_back(this);
        }
        else if constexpr (std::is_same_v<T, float>)
        {
            floatVec.push_back(this);
        }
        else if constexpr (std::is_same_v<T, std::string>)
        {
            stringVec.push_back(this);
        }
    }
};

// 测试示例
int main()
{
    myClass<int> obj1;
    myClass<float> obj2;
    myClass<std::string> obj3;

    // 以下代码会触发编译错误,因为double不在允许范围内
    // myClass<double> obj4;

    return 0;
}

关键细节

  • std::disjunction_v会在编译阶段检查模板参数T是否为允许类型之一,不满足则触发static_assert报错。
  • constexpr if确保分支逻辑在编译时完成,仅保留匹配类型的代码,无运行时分支开销。
  • 全局容器声明时使用class myClass<int>*是因为模板尚未定义,需前向声明对应类型。

方案二:C++11/14兼容版本(模板特化实现)

通过模板特化仅实现允许的类型,未特化的类型会因无定义直接触发编译错误:

#include <vector>
#include <string>

std::vector<class myClass<int>*> intVec;
std::vector<class myClass<float>*> floatVec;
std::vector<class myClass<std::string>*> stringVec;

// 主模板仅声明,不提供定义
template<typename T>
struct myClass;

// int类型特化
template<>
struct myClass<int>
{
    int value;
    myClass() { intVec.push_back(this); }
};

// float类型特化
template<>
struct myClass<float>
{
    float value;
    myClass() { floatVec.push_back(this); }
};

// std::string类型特化
template<>
struct myClass<std::string>
{
    std::string value;
    myClass() { stringVec.push_back(this); }
};

// 测试示例
int main()
{
    myClass<int> obj1;
    myClass<float> obj2;
    myClass<std::string> obj3;

    // 以下代码会触发编译错误:myClass<double>未定义
    // myClass<double> obj4;

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:55:21