我提出的解決方案是使用「中性類型」動態地(如DavidRodríguez - dribeas所述)進行類型轉換。
優勢:
- 的解決方案是通用的:使用一個新的類型時,你不需要那麼任何特別的事情。
至於弊端
代碼:
struct Wrapper
{
// get the "neutral type" value
virtual string getValue() const = 0;
template <typename U> Wrapper* clone() const;
};
template <typename T>
struct WrapperT: Wrapper
{
explicit WrapperT(T v): value(v)
{
}
virtual string getValue() const
{
// use streams to conversion to neutral value, but
// other better method would be suitable
ostringstream strm;
strm << value;
return strm.str();
}
T value;
};
template <typename U> Wrapper* Wrapper::clone() const {
U value;
istringstream strm(getValue());
strm >> value;
return new WrapperT<U>(value);
}
編輯:
爲了更好的性能解決方案,如果只使用數字類型,我們可以通過long double
爲 「中立型」 轉變string
:
template <typename T>
double long WrapperT<T>::getValue() const
{
return value;
}
template <typename U> Wrapper* Wrapper::clone() const {
return new WrapperT<U>(getValue());
}
我們是否想避免積分浮動僅使用整數類型時的點轉換?在這種情況下,該解決方案將是複雜一點:
- 在
clone()
功能取決於U
模板創建兩個getValue()
虛擬函數,一個用於積分和另一個用於浮點,
- 選擇所需
getValue()
功能參數類型(目標類型)。
如果有人在下一行「t->克隆()',你希望發生什麼? (其中'foo'是完全不相關的類型) –
Yakk
轉換指導者模板顯式WrapperT(const WrapperT &);'? –
jrok
@jrok:構造函數不知道真實類型。他想從一個指針轉換爲基類到派生類型。 –