:
は手動でも、このようなテンプレートをインスタンス化することができます。コンパイラは関数を呼び出す(正確にはインスタンス化する)まで、tmp
が何であるかを知らないので、コードを書く方法を知らない。たとえば、このテンプレートを考えてみましょう。T
が整数の場合
template <typename T>
T add(T left, T right) {
return left + right;
}
、その後、関数本体は、整数のアドオンです。 T
がdoubleなら、浮動小数点加算です。 T
がstd::string
の場合は、std::string::operator+
の関数呼び出しです。
C++プログラムには多くの型があり、多くは追加できますが、ほとんどすべてが異なる方法で追加されます。この型を知るまで、関数のコードを作成することはできません。すべての可能なタイプT
のためにそれをしようとすると、ほとんどすべてが使用されない可能性のある実装の組み合わせの爆発を得るでしょう。あなたのコンパイル時間とバイナリサイズは、もしあれば少しでも大きなものになります。
class templatesでは少し複雑になります。クラステンプレートのインスタンス化は、呼び出されていなければ実際にすべての関数をインスタンス化する必要はありません。私たちが代わりに書いてあれば、私たちの例に戻って:コンパイラはadd<int>
が潜在的に興味深いであることを知っているすべての情報を持っているにもかかわらず、あなたが実際にがないので
template <typename T>
class Adder {
T add(T left, T right) {
return left + right;
}
};
Adder<int> a;
このまだは、Adder<int>::add
をインスタンス化しませんはそれを呼び出したり、インスタンス化したりします。
これは*テンプレート関数*ではありません。これは*関数テンプレート*です。これは機能ではなく、将来の機能の青写真です。それは完全に重要ではありません。'func'は*テンプレート関数*、つまりすべてのテンプレートパラメータが既に分かっている*関数テンプレート*になります。これは*テンプレートをインスタンス化して、 "マテリアライズ"させます。 –
AnT