私はで記事を読んでいます:
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のように変換できない場合は、エラーが発生します。