我正在编写一个带有模板向量类型的简单数学库:
template<typename T, size_t N>
class Vector {
public:
Vector<T, N> &operator+=(Vector<T, N> const &other);
// ... more operators, functions ...
};
现在我想要一些专门针对其中一些的附加功能。假设我想要函数x()
并y()
访问Vector<T, 2>
特定的坐标。我可以为此创建一个部分专业化:
template<typename T>
class Vector<T, 3> {
public:
Vector<T, 3> &operator+=(Vector<T, 3> const &other);
// ... and again all the operators and functions ...
T x() const;
T y() const;
};
但现在我要重复通用模板中已经存在的所有内容。
我也可以使用继承。将通用模板重命名为VectorBase
,我可以这样做:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
};
template<typename T>
class Vector<T, 3> : public VectorBase<T, 3> {
public:
T x() const;
T y() const;
};
但是,现在的问题是所有运算符都定义在 上VectorBase
,因此它们返回VectorBase
实例。这些不能分配给Vector
变量:
Vector<float, 3> v;
Vector<float, 3> w;
w = 5 * v; // error: no conversion from VectorBase<float, 3> to Vector<float, 3>
我可以提供Vector
一个隐式转换构造函数来实现这一点:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
public:
Vector(VectorBase<T, N> const &other);
};
但是,现在我又来回转换了Vector
。VectorBase
尽管内存中的类型相同,并且编译器可能会优化所有这些,但感觉很笨重,而且我真的不喜欢对本质上是编译时问题的潜在运行时开销。
有没有其他方法可以解决这个问题?