假设我有一个容器类型,我想附加其他信息。我的方法是定义一个包含容器和信息的类。为模拟容器方法的新类定义方法是一种好习惯吗?例如,我想写myContainerObject.internalVector[i]
而不是写myContainerObject[i]
。人们必须重新定义一个人希望使用的方法(size(), push_back()
等)。这种方法的缺点是什么?存在哪些替代方案(例如,从容器继承更好的解决方案?)。
答案 0 :(得分:2)
您正在使用具有转发功能的组合,并且使用STL容器等具体类是正确的。一个缺点是你必须重新定义你想要允许的每个函数的每个重载,只转发参数,以及parrot-typedef嵌套类型(如iterator
)。
另一种方法是继承,但从不公开,仅使用私有继承(因为STL容器的析构函数是 public 和非 -virtual),然后在自定义类中使用 using-declarations ,将基类函数和类型的名称放入范围(对于所有重载,只需要一个using Base::name;
功能)。
答案 1 :(得分:2)
抓住一个容器类型的可能方法,我能想到:
提供一个装饰器(这是你要问的),其组件将是内部容器。当您拥有必须遵守的严格接口时,这可以工作。这既不是好事也不是坏事。了解装饰设计模式。
在算法中使用迭代器概念而不是容器。这是一种通用的方法,以及如何实现stl算法
使用容器概念 - 类似于(2)。检测类型是否为容器(SFINAE技巧)并对其进行操作。
重新实现容器界面。你需要一个非常强大的理由去做,因为它需要大量的工作/技术诀窍。一些信息:http://stdcxx.apache.org/doc/stdlibug/16-3.html
通常,除非您的用例非常非常简单,或者您有一些特定要求,否则不应将类内部状态(myContainerObject.internalVector [i])暴露给外部世界。
答案 2 :(得分:0)
最佳做法是保持内部隐私并实施[] operator
和其他功能(size()
等)。