类模板中的别名

ATK*_*ATK 2 c++

对于接下来的课程

template<typename T>
class test { 
   public:
   using unit = std::micro;    
};
Run Code Online (Sandbox Code Playgroud)

如何访问单元,而test::unit无需指定模板参数或使其成为模板别名。请注意,插入一个虚拟模板参数,例如 . int 不是一个选项,因为某些模板类无法用此类类型实例化。

for*_*818 6

首先,重要的是要理解模板中的所有内容实际上都取决于模板参数T。即使第一眼看起来并不像。

考虑一下可以有一个专门化:

template <>
struct foo< bar > {};
Run Code Online (Sandbox Code Playgroud)

现在有一个foo没有成员别名的实例化。foo::unit这就是为什么不能按您希望的方式工作的原因。


请注意,插入一个虚拟模板参数,例如 . int 不是一个选项,因为某些模板类无法用此类类型实例化。

我不明白这个论点。如果存在无法实例化的不同类模板(没有模板类,它们称为类模板),int则选择不同的默认值。您无需对所有内容使用相同的默认值。

然而,如上所述,使用默认参数然后引用别名 via 的方法foo<>::unit无论如何都是有缺陷的。


简单的解决方案是不将别名作为成员:

using unit = std::micro;    
template<typename T> class test { };
Run Code Online (Sandbox Code Playgroud)

另一方面,如果它应该是类的一部分,则可以将其移动到非模板基类:

struct base { using unit = std::micro; }
template <typename T> struct test : base {};
Run Code Online (Sandbox Code Playgroud)