嗯,通常情况下,您应该将顶点类型作为模板参数,以便正确存储它:
template<typename T, size_t NumAxes = 3>
class vertex {
private:
T comp[NumAxes];
};
在这种情况下,不需要虚拟方法,因为您可以使用 C++ 的类型转换来完成这项工作:
template<typename T, size_t NumAxes = 3>
class vertex {
public:
template <typename U>
void setComp(size_t index, U value) { comp[index] = static_cast<T>(value); }
private:
T comp[NumAxes];
};
现在,如果您希望它是虚拟的,因为您希望子类能够弄乱事物(例如记录值的每次更改),您需要定义一个非模板函数:
template<typename T, size_t NumAxes = 3>
class vertex {
public:
template <typename U>
void setComp(size_t index, U value)
{ _setComp(index, static_cast<T>(value)); }
protected:
T comp[NumAxes];
virtual void _setComp(size_t index, T value)
{ comp[index] = value; }
};
template<typename T, size_t NumAxes = 3>
class logged_vertex: public vertex<T, NumAxes> {
protected:
virtual void _setComp(size_t index, T value);
};
template<typename T, size_t NumAxes = 3>
void logged_vertex<T, NumAxes>::_setComp(size_t index, T value)
{ cout << "Index " << index << " changed from " << comp[index];
vertex<T, NumAxes>::_setComp(index, value);
cout << " to " << comp[index] << endl;
}