c++ - 对于这种类似继承的情况,什么是好的模式/实现?

标签 c++ c++11

假设我有两种不同的数学 vector 实现(以及其他数学结构,例如矩阵):

class SparseVector {
  double dotproduct(SparseVector& other);
};

class DenseVector {
  double dotproduct(DenseVector& other);
};

我想实现只使用稀疏代数或密集代数的算法。当然,我只想实现一个通用版本的算法,它可以处理这两者中的任何一个。

第一个想法是创建一个虚拟 vector 类(下面的代码用于概念,它实际上不会以这种方式工作):

class Vector {
  virtual double dotproduct(Vector& other);
};

class SparseVector : public Vector {
  double dotproduct(SparseVector& other) override;
};

class DenseVector : public Vector  {
  double dotproduct(DenseVector& other) override;
};

但这不起作用,因为每个 Vector 实现只能与相同类型的其他 vector 一起使用。 (也就是说,实现不应允许稀疏 vector 和密集 vector 之间存在点积)。

是否有好的实现策略或设计模式可以避免我必须实现两次算法?

问题与this one不一样,因为我不想支持稀疏 vector 和密集 vector 之间的点积。

我在考虑使用模板:

template<class T>
    class algorithm {
}

但我不知道如何将 T 限制为 SparseVector/DenseVector 之一,因此编译器知道存在合适的 dotproduct() 函数。

最佳答案

您正在寻找的东西称为访客模式或双重 dispatch 。您应该能够轻松地在线找到更多信息。然而,要点基本上是这样的:对于常规虚函数或 OOP,调用的代码取决于一个对象的类型。使用访问者模式,您可以根据两个对象选择代码(因此也称为 Double Dispatch),这基本上就是您所需要的。

关于c++ - 对于这种类似继承的情况,什么是好的模式/实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58577921/

相关文章:

c++ - 引用类型和文字类型

c++ - 如果存在具有不同参数类型的重载,则无法从全局命名空间中找到函数

c++ - 什么库或软件盲目签名和验证?

C++11 std::shared_ptr 工作正常,但 boost::shared_ptr 崩溃,这可能是什么原因?

c++ - 如何在默认模板参数中引用自身类型?

c++ - 默认值和零初始化困惑

c++ - 是否可以编写通用的重新绑定(bind)模板?

c++ - 如何在STL vector 矩阵中插入元素?

c++ - 将标准输出写入字符串变量

c++ - QTableWidget 获取垂直表头标签