如何正确消除继承类型定义的歧义?以及如何简化他们的创作?
How to correctly disambiguate inherited typedefs? And how to ease their creation?
让我们考虑一下这样的代码,我在其中创建了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();
};
通常这没有问题,但是当我从多个类继承时,我必须消除多个继承别名之间的歧义。
有没有更简单的方法来消除歧义?(可能具有 C++14/17 功能(
如果没有,有没有更简单的方法为每个类自动创建别名?我不想在每个类定义中
typedef std::unique_ptr<Foo> Ptr
。我想让Foo::Ptr
,Foo::ConstPtr
在每个班级中公开可见。最新的Eclipse Oxygen解析器坏了吗?它通常可以正确理解代码(包括 A(,但突出显示 (B( 并显示错误:"typedef 不明确"。在这种情况下,原因似乎是多重继承。GCC 没有问题,编译时没有任何警告。
如果我的
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();
出于文档目的可能会更好。它使如何使用该功能变得更加明显。
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何正确消除继承类型定义的歧义?以及如何简化他们的创作?
- 如何通过 CMake 使用他们的 SHA256 哈希下载提升?
- 我想在C++中安排结构.通过他们的标记以及他们的其他属性
- Google协议重复值如何结构化?他们的局限性和优势是什么
- QML实例化C 对象.我如何访问他们的方法
- 人们是否使用类作为他们的"game loop?"
- C 标准图书馆支持课程必须挑剔他们的朋友
- 有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗
- IM 创建一个 C++ 程序,其中用户可以尝试 2 次尝试密码用户名组合.如果他们无法获得它,他们的程序就会停止
- MyoSDK 并编译他们的示例错误
- Octave 的 rref(简化行梯队形式)等效于 C++ API
- 处理程序中的多个函数时.如何最好地处理他们的逻辑
- 用C++03的方法简化接口声明
- 按年龄升序显示他们的名字
- 如何将可变模板参数的特征值简化为一个值
- 在C++参数中的引用和指针如何实际工作?他们的固定协议/"rule"是什么?
- 如何用他们的静态库构建Qt5应用程序
- 为什么Microsoft在他们的 winnt.h 文件中两次 typedef 声明什么构成 "double" ?
- 客户端需要在他们的机器上安装OpenCv来运行c++ DLL(使用OpenCv库)吗?