c++ - 如何实现一个在一种情况下具有明显不同实现的类?

标签 c++ templates data-structures

我正在尝试实现一个数据结构来管理 n 维 vector ,其中 n 不会大于 50。

问题是 n = 2 是一个特例,它具有相同的接口(interface),但实现完全不同。我该如何实现?

我正在考虑使 n 成为模板参数并且:

  1. 对 n = 2 进行部分模板特化
  2. 复制粘贴 n = 2 的界面
  3. 使用工厂构造数据结构,该工厂将为 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 具有相同的数据成员,所以我做了 opsTwoopsThreeAndMore共享。如果不是这种情况,您可以分配新的 VectorOperationsTwoVectorOperationsThreeAndMore在构造函数中。

关于c++ - 如何实现一个在一种情况下具有明显不同实现的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18015498/

相关文章:

C++ 连接 LPCTSTR

c++ - 如何在 Code::Blocks IDE 中逐行调试?

c++ - C++ 中的编译流程

c++ - Hashmap 适用于 X 个元素?

algorithm - 排序需要多少操作?

algorithm - 证明二叉搜索树的中序遍历是有序的(无需归纳)

c++ - 我如何每小时将数据写入多个进程的当前小时命名的文件?

c++ - 模板和抽象类

c++ - 有没有办法在 C++ 中同时为多个模板分配一个类型?

c++ - 如何自动清理 C++ 中的代码?