对于以下类
template<typename T> class test { public: using unit = std::micro; };
我如何访问像test::unit这样的单元而不需要指定模板参数或使其成为模板别名。请注意,插入一个伪模板参数(例如int)不是一个选项,因为一些模板类不能用这样的类型示例化。
test::unit
3htmauhk1#
首先,重要的是要理解模板中的所有内容都依赖于模板参数T,即使乍一看并不像。考虑一下可以有一个专门化:
T
template <> struct foo< bar > {};
现在有一个没有成员别名的foo示例化,这就是为什么foo::unit不能按您希望的方式工作的原因。请注意,插入伪模板参数(例如int)不是一个选项,因为某些模板类不能用这样的类型示例化。我不明白这个论点。如果有一个不同的类模板(没有模板类,它们被称为类模板)不能用int示例化,那么选择一个不同的默认值。你不需要对所有的类使用相同的默认值。然而,如上所述,使用默认参数然后通过foo<>::unit引用别名的方法无论如何都是有缺陷的。简单的解决方案是不将别名作为成员:
foo
foo::unit
int
foo<>::unit
using unit = std::micro; template<typename T> class test { };
另一方面,如果它应该是类别的一部分,则可以将它移至非样板基底类别:
struct base { using unit = std::micro; } template <typename T> struct test : base {};
1条答案
按热度按时间3htmauhk1#
首先,重要的是要理解模板中的所有内容都依赖于模板参数
T
,即使乍一看并不像。考虑一下可以有一个专门化:
现在有一个没有成员别名的
foo
示例化,这就是为什么foo::unit
不能按您希望的方式工作的原因。请注意,插入伪模板参数(例如int)不是一个选项,因为某些模板类不能用这样的类型示例化。
我不明白这个论点。如果有一个不同的类模板(没有模板类,它们被称为类模板)不能用
int
示例化,那么选择一个不同的默认值。你不需要对所有的类使用相同的默认值。然而,如上所述,使用默认参数然后通过
foo<>::unit
引用别名的方法无论如何都是有缺陷的。简单的解决方案是不将别名作为成员:
另一方面,如果它应该是类别的一部分,则可以将它移至非样板基底类别: