提问人:tommsch 提问时间:1/16/2023 更新时间:1/16/2023 访问量:65
复杂基类的 Typedef
Typedef for complicated base class
问:
我正在使用私有继承来建模我的 has-a 关系,但我的基类类型相当复杂(嗯,有点),我想为它创建一个 typedef。在 C++ 中是否可能出现以下情况
struct S : private typedef std::vector<int> Container {};
目前我正在做:
template< typename Container = std::vector<int> >
struct S : private Container {};
但是这个
- 将我的类转换为模板类。对于我当前的应用程序来说,这不是一个大问题(因为它无论如何都是一个模板类),但总的来说并不好。
- 当人们认为他们被允许指定自己的容器时,可能会导致错误。
答:
1赞
Christophe
1/16/2023
#1
考虑到:
- 不建议从标准容器继承;
- 在大多数情况下,组合可以取代私人继承;
- 您想要控制将使用的容器;
您可能更喜欢私人作曲:
struct S {
using Container = std::vector<int>; // outside struct also possible
private: Container container;
};
这里没有代码重复:使用继承时,您只需要一个容器子对象,而使用组合时,您将拥有一个容器成员,并且两者都将使用相同的代码。
私有继承没有决定性的优势,因为其他类不能使用基类中定义的公共成员。唯一的优点是可以在类定义中使用公共成员,而使用组合时,必须为成员添加对象名称的前缀。
评论
0赞
tommsch
1/16/2023
在我的真实代码中,我不是从 std:: 容器继承的,而是从我自己的容器继承的。(我正在为 Cuda 编写一个容器),并且由于 Cuda-C++ 非常有限,我有很多 SFINAE,每个成员函数大约实现三次。因此,从这个角度来看,私有继承更容易使用。
评论
typedef
using
std::vector
S
vector