复杂基类的 Typedef

Typedef for complicated base class

提问人:tommsch 提问时间:1/16/2023 更新时间:1/16/2023 访问量:65

问:

我正在使用私有继承来建模我的 has-a 关系,但我的基类类型相当复杂(嗯,有点),我想为它创建一个 typedef。在 C++ 中是否可能出现以下情况

struct S : private typedef std::vector<int> Container {};

目前我正在做:

template< typename Container = std::vector<int> >
struct S : private Container {};

但是这个

  • 将我的类转换为模板类。对于我当前的应用程序来说,这不是一个大问题(因为它无论如何都是一个模板类),但总的来说并不好。
  • 当人们认为他们被允许指定自己的容器时,可能会导致错误。
C++ 继承 typedef

评论

0赞 Alan Birtles 1/16/2023
将 (或 ) 声明为成员?请注意,继承自通常不可取,请改用成员typedefusingstd::vector
0赞 tommsch 1/16/2023
@Alan 这将是代码重复
0赞 Alan Birtles 1/16/2023
你要么必须在类之外创建你的 typedef,然后从中继承,要么不得不在里面输入两次。如果向量是成员变量,则不会有 or 问题
4赞 StoryTeller - Unslander Monica 1/16/2023
您可以只使用注入的类名。底座内部以 命名。Svector

答:

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,每个成员函数大约实现三次。因此,从这个角度来看,私有继承更容易使用。