标记容器 - 模仿容器的界面是一种好的做法吗?
Tagged container - is mimicking the container's interface a good practice?
假设我有一个容器类型,我想附加附加信息。我的方法是定义一个包含容器和信息的类。为新类定义模仿容器方法的方法是一种好的做法吗?例如,我想写myContainerObject[i]
,而不是写myContainerObject.internalVector[i]
。人们必须重新定义每个想要使用的方法(size(), push_back()
等)。这种方法的缺点是什么?存在哪些替代方案(例如,从容器继承是更好的解决方案吗?)。
您正在使用带有转发函数的组合,使用STL容器等具体类是正确的做法。一个缺点是,您必须重新定义想要允许的每个函数的每个重载,仅用于转发参数以及鹦鹉typedef嵌套类型(如iterator
)。
另一种选择是继承,但从不公开,只使用私有继承(因为STL容器的析构函数是公共和非-虚拟的),然后在自定义类内使用声明将基类函数和类型的名称带入作用域(函数的所有重载只需要一个using Base::name;
)。
获取容器类型的可能方法,我可以想到:
-
提供一个decorator(这就是您所询问的),其组件将是内部容器。当您有必须遵守的严格接口时,这是可行的。这既不是好的做法,也不是坏的做法。阅读装饰器设计模式。
-
在算法中使用迭代器概念,而不是容器。这是一种通用方法,以及stl算法是如何实现的
-
使用容器概念-类似于(2)。检测该类型是否为容器(SFINAE技巧)并对其进行操作。
-
重新实现容器接口。你需要一个非常有力的理由来做这件事,因为这需要大量的工作/专业知识。一些信息:http://stdcxx.apache.org/doc/stdlibug/16-3.html
一般来说,除非您的用例非常、非常琐碎,或者您有一些特定的需求,否则您不应该将类内部状态(myContainerObject.internalVector[i])公开到外部世界。
最佳实践是保持内部私有,并实现[] operator
和其他功能(size()
等)。
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在运行时检查继承是否只有一种类型和 void*
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 寻找一种更好的方法来表示无符号字符数组
- 标记容器 - 模仿容器的界面是一种好的做法吗?