类模板偏特化无法减参数?GCC/Clang编译报错求解
类模板支持多参数/少参数调用的正确实现方式
你的核心问题在于误解了类模板偏特化的作用:类模板的偏特化不能改变主模板的参数数量,偏特化只是对主模板的模板实参进行模式匹配,实例化时必须满足主模板的参数个数要求。你写的make_it<int>、A<int,3>报错,本质是传入的参数个数和主模板要求的不一致,和偏特化无关。
要实现make_it<type, type>和make_it<type>两种调用方式,有以下两种可行方案:
方案1:给主模板设置默认模板参数
这是最直接的方式,通过给主模板的部分参数设置默认值,让用户可以选择传入更少的参数:
针对你的make_it示例修改:
// 主模板:第二个参数默认设为T* template<class T, class TT = T*> class make_it { }; // 针对TT=T*的情况做偏特化(如果需要特殊实现) template<class T> class make_it<T, T*> { }; // 合法调用: make_it<int>; // 自动推导第二个参数为int* make_it<int, double>; // 显式传入两个参数
针对你的A示例修改:
// 主模板:第二个参数默认设为T1*,第三个参数默认设为0 template<class T1, class T2 = T1*, int I = 0> class A {}; // 针对T2=T1*的情况做偏特化 template<class T, int I> class A<T, T*, I> {}; // 合法调用: A<int, 3>; // T1=int,T2默认int*,I=3 A<int>; // T1=int,T2=int*,I=0 A<int, double, 5>; // 显式传入三个参数
方案2:使用模板别名(C++11及以上)
如果不想修改主模板的默认参数,可以通过模板别名创建单参数版本的“快捷方式”:
// 原双参数主模板 template<class T, class TT> class make_it { }; // 单参数调用的别名 template<class T> using make_it_single = make_it<T, T*>; // 调用方式: make_it<int, double>; // 原双参数方式 make_it_single<int>; // 单参数快捷方式
关键注意点
- 类模板偏特化的模板参数列表是用来推导主模板实参的,不能减少主模板要求的参数数量。
- 默认模板参数是扩展类模板调用方式的标准做法,兼容性最好。
内容的提问来源于stack exchange,提问作者Andrey Zabolotnyi
相关产品推荐
相关产品推荐

