C++の関数テンプレートとテンプレート関数、およびテンプレートクラスとクラステンプレートの違いを尋ねる質問に遭遇しました。
関数テンプレートとテンプレート関数は同じものだという印象を受けました。 2つの違いはありますか?
2つの違いはありますか?
全然違いません。 google for it の場合、どこかで function templates として定義され、どこかで template function として定義されていることがわかります。
関数テンプレートとテンプレート関数は同じものだという印象を受けました。
あなたの理解は正しかった。
関数テンプレートとテンプレート関数には違いがあります。
_template<class Type>
void Foo(Type tData) {...}
_
関数テンプレートFooにintを渡したいが、doubleが渡されたかのようにコンパイラーがインスタンス化して、次のように呼び出す場合:
_Foo<double> ( 12 );
_
次のテンプレート関数をインスタンス化します。
_void Foo(double);
_
この特別な構文Foo<>()
を使用すると、明示的に渡される型のFoo関数をインスタンス化するようコンパイラーに要求し、関数の引数によって型を推定しないようコンパイラーに要求します。
関数テンプレートは、実際の関数ではなく、コンパイラーによって完全にコンパイルされない、テンプレートキーワードを括弧で囲んだ関数の本体です。リンカーは責任を負いません。特定のデータ型をインスタンス化するには、少なくとも1回の呼び出しが必要であり、コンパイラとリンカの責任になります。したがって、関数テンプレートFooのインスタンスは、Foo(int)またはFoo(double)としてインスタンス化されます。
テンプレート関数は単に「関数テンプレートのインスタンス」であり、それを呼び出すか、特定のデータ型に対してインスタンス化させます。 function-templateのインスタンスは、実際には有効な関数です。
関数テンプレート(別名template-function)のインスタンスは、コンパイラーとリンカーの名前装飾システムの傘下では、通常の関数ではありません。つまり、function-templateのインスタンス:
_template<class T>
void Foo(T data) {...}
_
テンプレート引数doubleの場合は、次のようにはなりません:
_void Foo(double data) {...}
_
でも実は:
_void Foo<double>(double x) {...}
_
あなたはここでもっと読むことができます:
テンプレートクラスは使用すべきではない用語です。これは、現在呼ばれているものを指定するために使用されましたクラステンプレートの特殊化少なくとも98標準以来ですが、 クラステンプレートの同義語として使用する傾向があります(これは過去にも当てはまり、明確な別の用語が導入されました)。
注釈付きC++リファレンスマニュアル(Ellis and Stroustrup、1990)から:
クラステンプレートは、個々のクラスの構築方法を指定します。
クラステンプレートから生成されたクラスはテンプレートクラスと呼ばれます。
彼らは同じものです。 Standardeseは「関数テンプレート」と「クラステンプレート」ですが、多くの人(私を含む)は、「テンプレート関数」と「テンプレートクラス」と呼ぶ傾向があります。 「テンプレート」を書いてから、「クラス」または関数を書いてください。したがって、これらはしばしば両方とも呼ばれます。