我目前正在开发一个自定义的 C++ 容器库,std::vector
它std::span
类似于- 类似的论点。std::span
std::vector
我能做的是构造一个类,比如说my_vector
,和另一个my_span
可以从类转换的类my_vector
。这就是 STL 所做的,我知道模仿标准库通常是个好主意。但是我有这个想法,my_span
基本上是my_vector
不拥有内存的,因此可以使用继承来实现这两个类。这是它在代码中的样子。
class my_vector;
class my_span {
private:
/* span sees [data_ + start_, data_ + stop_) */
T* data_;
size_t start_;
size_t stop_;
friend class my_vector;
public:
/* Member functions operating on non-owning memory */
};
class my_vector : public my_span {
private:
size_t cap_;
public:
/* Member functions like resize, push_back, etc. */
};
现在我的同事基于以下原因拒绝了这个想法。公平地说,我对他的反对意见的表述可能并不忠实。
- 在实际容器之前定义跨度是违反直觉的。
- 当派生类扩展时使用继承,但该类
my_vector
的条件是其成员start_
始终为0
. (有一些原因迫使指针data_
总是指向分配内存的开头。这就是为什么我不能只使用指针和跨度的长度。)
另一方面,我相信这种设计有以下好处。
- 如果你仔细想想,
my_vector
仍然是“是一个”my_span
。它只是一个my_span
拥有内存并且可以改变大小的东西。 - 每个在非拥有内存上操作的成员函数只能声明和实现一次;该类
my_vector
自动继承它。 - 要
my_vector
用作my_span
,您无需创建新my_span
实例。向上转换比构造函数更自然。
我还没有看到遵循这种模式的设计,所以我想获得更多关于这是否是一个好的设计的意见。