如何正确消除继承类型定义的歧义?以及如何简化他们的创作?

How to correctly disambiguate inherited typedefs? And how to ease their creation?

本文关键字:他们的 何简化 何正确 继承 定义 类型 歧义      更新时间:2023-10-16

让我们考虑一下这样的代码,我在其中创建了Typedef类来自动继承别名。

#include <memory>
template <typename T>
struct Typedef
{
typedef std::unique_ptr<T> Ptr;
typedef std::unique_ptr<const T> ConstPtr;
};
struct X : public Typedef<X> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<X>
struct Y : public Typedef<Y> { Ptr Func(); }; // no problem, Ptr = std::unique_ptr<Y>
struct A : public X, public Typedef<A>
{
using Typedef<A>::Ptr; // (A), better than typedef typename Typedef<A>::Ptr Ptr, am I right?
Ptr Func();
};
struct B : public X, public Y, public Typedef<B>
{
using Typedef<B>::Ptr; // (B)
Ptr Func();
};

通常这没有问题,但是当我从多个类继承时,我必须消除多个继承别名之间的歧义。

  1. 有没有更简单的方法来消除歧义?(可能具有 C++14/17 功能(

  2. 如果没有,有没有更简单的方法为每个类自动创建别名?我不想在每个类定义中typedef std::unique_ptr<Foo> Ptr我想让Foo::PtrFoo::ConstPtr在每个班级中公开可见。

  3. 最新的Eclipse Oxygen解析器坏了吗?它通常可以正确理解代码(包括 A(,但突出显示 (B( 并显示错误:"typedef 不明确"。在这种情况下,原因似乎是多重继承。GCC 没有问题,编译时没有任何警告。

  4. 如果我的Typedef类声明了更多的别名,并且我有冲突 - 有没有比using Typedef<Foo>::Ptr更简单的方法来解决所有冲突,...::ConstPtr所有冲突?

如果你真的坚持这种行为,一种可能性是添加额外的类......

struct XBase { ... };
struct YBase { ... };
struct X : public XBase, public Typedef<X> { ... };
struct Y : public YBase, public Typedef<Y> { ... };
struct ABase { ... };
struct BBase { ... };
struct A : 
public ABase, 
public XBase, 
public Typedef<A> { ... };
struct B : 
public BBase, 
public XBase, 
public YBase, 
public Typedef<B> { ... };

这样,即使具有多重继承,每个类也可以轻松提供自己的别名。

但是,正如我在评论中所解释的,我一般不建议这种做法。

应避免多重(公共(继承,因为它会产生强耦合。通常最好改用构图。接口类是一个例外(只有纯虚函数,如果打算能够从对象的接口指针销毁对象,则可能是虚拟析构函数(。混合可能是多重继承可能有用的另一种情况,但在这种情况下,您将使用私有继承,即使这样组合也可能更可取。耦合越少,如果要进行重大更改,系统就越容易维护。

同样正如我的评论中所解释的,定义这样的 typedef 可能不是一个好主意,因为std::unique_ptr<>具有与之关联的行为,并且无论如何您编写std::unique_ptr<A> Func();出于文档目的可能会更好。它使如何使用该功能变得更加明显。