c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?

标签 c++ templates typedef multiple-inheritance

让我们考虑一下我在其中创建的代码 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::Ptr , Foo::ConstPtr在每个类(class)公开可见。

  3. 最新的 Eclipse Oxygen 解析器坏了吗?它通常能正确理解代码(包括 A),但突出显示 (B) 时有错误:“typedef is ambiguous”。在这种情况下,原因似乎是多重继承。 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> { ... };

这样,每个类都有一种简单的方法来提供自己的别名,即使是多重继承也是如此。

但是,正如我在评论中所解释的那样,我通常不建议采用这种方法。

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

此外,正如我在评论中所解释的那样,自 std::unique_ptr<> 以来定义此类 typedef 可能不是一个好主意。具有与之关联的行为,出于文档目的,您编写 std::unique_ptr<A> Func(); 可能会更好反正。它使应该如何使用该功能更加明显。

关于c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45389141/

相关文章:

c++ - openCV中的掩蔽

c++ - 修改指针后C++中数组的释放器

django - 模板中没有命名循环。 'row1,row2' 未定义

c++ - 类内的typedef

c - 将 C 代码移植到 Arduino 平台(struct 和 typedef 定义中的错误)

c++ - 在 x + y 中获取 "carry"

java - 仅用于语义的类

c++ - 对于 GCC 的 "sorry, unimplemented: cannot expand ‘NEXT ...’ 到固定长度参数列表“错误”,是否有一个很好的解决方法?

有条件地返回不同类型的 C++ 函数

c - 多维数组和指向具有一个 Typedef 的数组的指针