【问题标题】:Using-declaration of an existing type from base class vs creating a type alias inside child class使用基类中现有类型的声明与在子类中创建类型别名
【发布时间】: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
};
  1. 有什么区别吗?
  2. 每种语法的优缺点是什么?
  3. 哪个是最常用/推荐的?

谢谢。

相关问题:Using-declaration of an existing namespace type vs creating a type alias

【问题讨论】:

  • 你知道class child 也继承了class base 的类型吗? IE。即使没有typedefusing,当mytypebase 中声明并且child 派生自base 时,child::mytype 也会被识别。 Example
  • 这是一个非常简单的代码示例,但在我的例子中,我有一个更复杂的层次结构和多重继承,这会阻止在子类中直接访问父类型。
  • 对于简单的情况,它的工作方式如上所示。如果您需要额外的限制,请尝试在您的minimal reproducible example 中表达这一点。即使对于多重继承,这也应该只需要几行额外的代码就可以实现。 ;-) 顺便提一句。如果可能的话,我会尽量避免多重继承,而且大多数时候是这样。聚合通常也很有效。
  • usingtypedef 在您使用它们时都声明了一个类型的替代名称,而不是创建一个新类型。在大多数情况下,它们是等价的——它们之间的选择是主观的。 using 可以更好地使用模板 - 例如,template<typename T1, typename T2> using Map = std::map<T1, std::vector<T2> > 可以使用 typedef 复制,但不是特别容易。

标签: c++ typedef type-alias using-declaration


【解决方案1】:

有区别。考虑一下如果你的结构 A 和 B 被定义为:

struct A {
protected:
    int mytype;
};

struct B {
protected:
    double mytype;
};

那样的话

struct C : A, B {
    using typename A::mytype;  // Would compile, but is mytype a type or
                               // an exposed member of the base class?
    //using mytype = A::mytype;  // Would not compile
};

在你的情况下,我建议使用using mytype = A::mytype;,因为它不那么模棱两可。

【讨论】:

  • 经过一些测试,它看起来像一个 gcc 错误,因为 clang 抱怨 error: 'typename' keyword used on a non-type
  • 这很有趣。在我看来,只有 clang 抱怨这一点,gcc 和 MSVC 甚至不生成警告。 en.cppreference.com/w/cpp/language/using_declaration 表示typename 是可选的并且“可以根据需要用于解析依赖名称”。
猜你喜欢
  • 2020-02-15
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多