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

如何检查两个C++类模板实例是否源自同一类模板(C++11兼容)

解决方案

在C++11中,你可以通过类型萃取模板剥离类模板实例的模板参数,提取出原始的类模板本身,再通过std::is_same比较萃取结果是否一致,以此判断两个实例是否来自同一个类模板。

实现步骤

  1. 定义基础的类型萃取模板,处理非模板类型的默认情况;
  2. 针对任意双参数类模板特化萃取模板,提取其原始模板类型;
  3. 使用萃取模板分别处理两个实例的类型,再用std::is_same比较结果。

完整代码示例

#include <iostream>
#include <type_traits>

template<typename T1, typename T2>
class A {
    float val;
public:

};

// 基础萃取模板:处理非模板类型
template<typename T>
struct template_template_of {
    using type = void; // 默认标记为void
};

// 特化萃取模板:匹配任意双参数类模板实例
template<template<typename, typename> class Template, typename T1, typename T2>
struct template_template_of<Template<T1, T2>> {
    using type = template<typename, typename> class Template;
};

int main() {
    A<double, double> a_float_type;
    A<int, int> a_int_type;

    // 检查两个实例是否来自同一类模板
    bool result = std::is_same<
        typename template_template_of<decltype(a_float_type)>::type,
        typename template_template_of<decltype(a_int_type)>::type
    >::value;

    std::cout << std::boolalpha << result << std::endl; // 输出true
}

代码说明

  • template_template_of是自定义的类型萃取器,特化版本会匹配所有双参数类模板的实例,提取出原始的模板(比如A<double,double>会被萃取为template<typename,typename> class A);
  • 通过std::is_same比较两个萃取后的模板类型,就能判断原始实例是否来自同一个类模板;
  • 使用std::boolalpha可以让输出显示true/false而非1/0,更直观。

如果需要支持其他参数数量的类模板,可以添加对应的特化版本(比如单参数、三参数模板的萃取特化)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:52:33