假设我有两种不同的数学 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/