簡體   English   中英

定義並調用類的轉換運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM