如何检查两个C++类模板实例是否源自同一类模板(C++11兼容)
解决方案
在C++11中,你可以通过类型萃取模板剥离类模板实例的模板参数,提取出原始的类模板本身,再通过std::is_same比较萃取结果是否一致,以此判断两个实例是否来自同一个类模板。
实现步骤
- 定义基础的类型萃取模板,处理非模板类型的默认情况;
- 针对任意双参数类模板特化萃取模板,提取其原始模板类型;
- 使用萃取模板分别处理两个实例的类型,再用
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
相关产品推荐
相关产品推荐

