C++模板类能否不重复指定模板参数就为自身定义别名?
最优实现方案:直接使用C++内置的注入类名特性
C++标准规定,类模板的内部作用域会自动注入不带模板参数的类名,这个名称会自动匹配当前实例化的完整类型,完全不需要手动重复罗列模板参数定义别名,直接使用即可:
template <class T, int a, int b, int c, int d, int e, int f> class ExampleClass { // 直接写类名ExampleClass就等价于ExampleClass<T,a,b,c,d,e,f> ExampleClass operator+(const ExampleClass& rhs) { // ... } // 其他场景也可以直接用,比如拷贝赋值运算符 ExampleClass& operator=(const ExampleClass&) = default; };
这个是C++98就支持的标准特性,所有主流编译器完全兼容,没有任何额外运行时开销,是目前最简洁的实现方案。
如果确实需要定义统一的类型别名(比如对外暴露类型、统一内部类型引用写法),也可以直接用注入类名定义,不需要重复写模板参数:
template <class T, int a, int b, int c, int d, int e, int f> class ExampleClass { public: // 直接用注入类名定义别名,无冗余参数 using ExampleClassType = ExampleClass; };
decltype(*this)编译失败的原因
你的猜测不准确,this指针在非静态成员函数的语境下是可以在编译期推导类型的,但你是在类的直接作用域(成员函数外部)定义别名,此时类的定义还未完成,this指针的语境不存在,所以无法编译。
如果一定要在成员函数内部推导当前实例类型,C++14及以上可以这么写,但完全没必要使用这么繁琐的写法:
#include <type_traits> ExampleClass operator+(const ExampleClass& rhs) { using ExampleClassType = std::remove_cvref_t<decltype(*this)>; // ... }
类外定义成员的简化方案
如果需要在类外定义成员函数,C++20开始支持类模板成员的简写语法,不需要重复写模板参数列表:
// C++20及以上支持 ExampleClass::ExampleClass(/* 构造函数参数 */) { // ... } ExampleClass ExampleClass::operator+(const ExampleClass& rhs) { // ... }
C++20之前的版本仍需要写完整的模板参数列表,但类名部分可以直接使用注入类名省略参数。
内容的提问来源于stack exchange,提问作者NickFP
相关产品推荐
相关产品推荐

