0

私はで記事を読んでいます:

http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

そして、私はいくつかの点を理解していません。OKAY。「変換」はどのようにして自分自身を任意のデータ型に変換できますか?下の行の終わりにある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);

Convert::IsEqualToをfloatパラメーターでインスタンス化します。以下に示すように、明示的な指定は、doubleでインスタンス化します。

bool b = Data.IsEqualTo<double>(Data2);

驚くべきことの1つは、テンプレートの助けを借りて、テンプレートの上に変換演算子を定義することでそれを行うことができます!

template<class T>
operator T() const
{
    return data;
} 

可能な場合はいつでも、Convertのクラステンプレートインスタンスを任意のタイプに変換することが可能になります。次の使用例を検討してください。

Convert<int> IntData(40);
float FloatData;
double DoubleData;


FloatData = IntData;
DoubleData = IntData;

これは、次の2つの方法(完全修飾名)をインスタンス化します。

Convert<int>::operator<float> float();
Convert<int>::operator<double> double();

一方で、余分なコードを記述せずに、Convertはそれ自体(特定のインスタンス化)を任意のデータ型に変換できるため、優れた柔軟性を提供します-コンパイルレベルで変換が可能な場合はいつでも。doubleからstring-typeのように変換できない場合は、エラーが発生します。


4

1 に答える 1

1

クラス型には、ユーザー定義の変換を含めることができます。これにより、クラスのインスタンスを別の型に変換できます。たとえば、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;
}

内部データをfloatで返す関数です。

この記事の混乱を招く 2 行は、例によってどの関数が生成されるかを示しているだけです。

Convert<int>::operator<float> float();
Convert<int>::operator<double> double();

1 つ目はoperator float、float に変換されることです。2 つ目はoperator double、double に変換することです。

于 2012-09-23T12:19:55.250 に答える