我正在尝试实现一个数据结构来管理 n 维 vector ,其中 n 不会大于 50。
问题是 n = 2 是一个特例,它具有相同的接口(interface),但实现完全不同。我该如何实现?
我正在考虑使 n 成为模板参数并且:
- 对 n = 2 进行部分模板特化
- 复制粘贴 n = 2 的界面
- 使用工厂构造数据结构,该工厂将为 n = 2, 3, ..., 50 实例化此结构的原型(prototype)
有没有更好的方法?按照我的建议实现,需要注意什么?
最佳答案
答案取决于是否n
在编译时或仅在运行时已知。
如果n
在编译时已知,然后部分模板规范是要走的路(本着与 std::vector<bool>
的实现相同的精神是模板规范)。
如果n
仅在运行时已知,您可以实现 State Pattern将执行操作的对象保留在 vector 内部,对其进行两个实现,并在 vector 对象中隐藏指向其实例的指针:
struct Vector;
struct VectorOperations {
virtual void doOperation1(Vector& v) = 0;
virtual void doOperation2(Vector& v) = 0;
};
struct VectorOperationsTwo: VectorOperations {
virtual void doOperation1(Vector& v);
virtual void doOperation2(Vector& v);
} opsTwo;
struct VectorOperationsThreeAndMore: VectorOperations {
virtual void doOperation1(Vector& v);
virtual void doOperation2(Vector& v);
} opsThreeAndMore;
class Vector {
VectorOperations *ops;
public:
Vector(int size) {
ops = size == 2 ? (VectorOperations*)&opsTwo : &opsThreeAndMore;
}
void operation1() {
ops->doOperation1();
}
void operation2() {
ops->doOperation2();
}
friend class VectorOperationsTwo;
friend class VectorOperationsThreeAndMore;
};
这个例子假设两个元素的 vector 和两个以上元素的 vector 具有相同的数据成员,所以我做了 opsTwo
和 opsThreeAndMore
共享。如果不是这种情况,您可以分配新的 VectorOperationsTwo
或 VectorOperationsThreeAndMore
在构造函数中。
关于c++ - 如何实现一个在一种情况下具有明显不同实现的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18015498/