好了,通常情況下,你應該有頂點類型作爲模板參數,因此它可以正確保存:
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;
}
我舉了一個使用類型擦除的例子來達到預期的效果,作爲回答http://stackoverflow.com/questions/1277650/templatized-virtual-function/1278328 – AProgrammer 2010-06-23 15:04:32