[英]defining and calling conversion operator of a class
我在閱讀文章:
http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1
我不明白這一點。 好的。如何將“轉換”自身轉換為任何數據類型? 在下面的行尾,float()和double()是什么意思? 轉換如何發生?能否詳細解釋一下?
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
當然,帶有方法模板的“顯式模板參數指定”也是可能的。 考慮另一個示例:
template<class T>
class Convert
{
T data;
public:
Convert(const T& tData = T()) : data(tData)
{ }
template<class C>
bool IsEqualTo( const C& other ) const
{
return data == other;
}
};
可以用作:
Convert<int> Data;
float Data2 = 1 ;
bool b = Data.IsEqualTo(Data2);
它使用float參數實例化Convert :: IsEqualTo。 如下所示,顯式規范將用double實例化它:
bool b = Data.IsEqualTo<double>(Data2);
令人驚訝的事情之一是,借助模板,您可以通過在模板之上定義轉換運算符來做到這一點!
template<class T>
operator T() const
{
return data;
}
只要有可能,就可以將Convert'類模板實例轉換為任何類型。 考慮以下用法示例:
Convert<int> IntData(40);
float FloatData;
double DoubleData;
FloatData = IntData;
DoubleData = IntData;
它將實例化以下兩種方法(完全限定的名稱):
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
一方面,它提供了很好的靈活性,因為無需編寫額外的代碼,只要可以在編譯級別進行轉換,Convert即可將自身(特定的實例化)轉換為任何數據類型。 如果無法進行轉換(例如從雙精度類型轉換為字符串類型),則會引發錯誤。
類類型可以具有用戶定義的轉換 。 這使您可以將類的實例轉換為另一種類型。 例如,這里有一個結構,當轉換為int時始終具有值42:
struct A {
operator int() { return 42; }
};
這是一個特殊的函數,即operator int
,被調用以轉換為int。 現在,如果我們有A的實例a
,我們可以輕松地將其轉換為int:
A a;
int x = a; // x now has the value 42
在本文中,它們顯示了如何使用模板為任何類型生成轉換運算符。 功能模板定義為:
template<class T>
operator T() const
{
return data;
}
現在,每當您嘗試將對象轉換為另一種類型時,都會生成該函數的新版本,將T替換為要轉換為的類型。 因此,如果我們進行float f = a
,將生成以下函數:
operator float() const
{
return data;
}
該函數以浮點數形式返回內部數據。
文章中的兩行讓您感到困惑,它們只是向您顯示該示例將生成哪些函數:
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
第一個是operator float
,它轉換為float。 第二個是operator double
,它轉換為double。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.