这更像是一个设计问题。
我有一个模板类,我想根据模板类型向它添加额外的方法。为了实践 DRY 原则,我提出了这种模式(有意省略了定义):
template <class T>
class BaseVector: public boost::array<T, 3>
{
protected:
BaseVector<T>(const T x, const T y, const T z);
public:
bool operator == (const Vector<T> &other) const;
Vector<T> operator + (const Vector<T> &other) const;
Vector<T> operator - (const Vector<T> &other) const;
Vector<T> &operator += (const Vector<T> &other)
{
(*this)[0] += other[0];
(*this)[1] += other[1];
(*this)[2] += other[2];
return *dynamic_cast<Vector<T> * const>(this);
}
virtual ~BaseVector<T>()
{
}
}
template <class T>
class Vector : public BaseVector<T>
{
public:
Vector<T>(const T x, const T y, const T z)
: BaseVector<T>(x, y, z)
{
}
};
template <>
class Vector<double> : public BaseVector<double>
{
public:
Vector<double>(const double x, const double y, const double z);
Vector<double>(const Vector<int> &other);
double norm() const;
};
我打算 BaseVector 只不过是一个实现细节。这行得通,但我担心operator+=
. 我的问题是:this
指针的动态转换是代码气味吗?有没有更好的方法来实现我想要做的事情(避免代码重复和用户代码中不必要的强制转换)?或者我是安全的,因为 BaseVector 构造函数是私有的?
编辑:
抱歉,是的,我有虚拟 dtor,但我忘了粘贴它,没有它代码无法编译。