【发布时间】:2020-02-15 08:14:41
【问题描述】:
我想从子类中的基类提供对现有类型的访问。
我发现了两种不同的方法:
struct A {
typedef int mytype;
};
struct B {
typedef double mytype;
};
我可以使用 using 声明“包含”该类型:
struct C : A, B {
using typename A::mytype;
};
或者我可以创建一个类型别名:
struct C : A, B {
typedef A::mytype mytype;
using mytype = A::mytype; //C++11
};
- 有什么区别吗?
- 每种语法的优缺点是什么?
- 哪个是最常用/推荐的?
谢谢。
相关问题:Using-declaration of an existing namespace type vs creating a type alias
【问题讨论】:
-
你知道
class child也继承了class base的类型吗? IE。即使没有typedef或using,当mytype在base中声明并且child派生自base时,child::mytype也会被识别。 Example -
这是一个非常简单的代码示例,但在我的例子中,我有一个更复杂的层次结构和多重继承,这会阻止在子类中直接访问父类型。
-
对于简单的情况,它的工作方式如上所示。如果您需要额外的限制,请尝试在您的minimal reproducible example 中表达这一点。即使对于多重继承,这也应该只需要几行额外的代码就可以实现。 ;-) 顺便提一句。如果可能的话,我会尽量避免多重继承,而且大多数时候是这样。聚合通常也很有效。
-
using和typedef在您使用它们时都声明了一个类型的替代名称,而不是创建一个新类型。在大多数情况下,它们是等价的——它们之间的选择是主观的。using可以更好地使用模板 - 例如,template<typename T1, typename T2> using Map = std::map<T1, std::vector<T2> >可以使用typedef复制,但不是特别容易。
标签: c++ typedef type-alias using-declaration