标记容器 - 模仿容器的界面是一个好习惯吗?

时间:2013-07-24 07:56:18

标签: c++ containers

假设我有一个容器类型,我想附加其他信息。我的方法是定义一个包含容器和信息的类。为模拟容器方法的新类定义方法是一种好习惯吗?例如,我想写myContainerObject.internalVector[i]而不是写myContainerObject[i]。人们必须重新定义一个人希望使用的方法(size(), push_back()等)。这种方法的缺点是什么?存在哪些替代方案(例如,从容器继承更好的解决方案?)。

3 个答案:

答案 0 :(得分:2)

您正在使用具有转发功能的组合,并且使用STL容器等具体类是正确的。一个缺点是你必须重新定义你想要允许的每个函数的每个重载,只转发参数,以及parrot-typedef嵌套类型(如iterator)。

另一种方法是继承,但从不公开,仅使用私有继承(因为STL容器的析构函数是 public -virtual),然后在自定义类中使用 using-declarations ,将基类函数和类型的名称放入范围(对于所有重载,只需要一个using Base::name;功能)。

答案 1 :(得分:2)

抓住一个容器类型的可能方法,我能想到:

  1. 提供一个装饰器(这是你要问的),其组件将是内部容器。当您拥有必须遵守的严格接口时,这可以工作。这既不是好事也不是坏事。了解装饰设计模式。

  2. 在算法中使用迭代器概念而不是容器。这是一种通用的方法,以及如何实现stl算法

  3. 使用容器概念 - 类似于(2)。检测类型是否为容器(SFINAE技巧)并对其进行操作。

  4. 重新实现容器界面。你需要一个非常强大的理由去做,因为它需要大量的工作/技术诀窍。一些信息:http://stdcxx.apache.org/doc/stdlibug/16-3.html

  5. 通常,除非您的用例非常非常简单,或者您有一些特定要求,否则不应将类内部状态(myContainerObject.internalVector [i])暴露给外部世界。

答案 2 :(得分:0)

最佳做法是保持内部隐私并实施[] operator和其他功能(size()等)。