関数テンプレートの部分特殊化またはオーバーロード?
C では、関数テンプレートの部分特殊化が可能であるというのはよくある誤解です。ただし、C 標準では完全な特殊化のみが許可されます。
オーバーロードと部分的な特殊化
最初に提供されたコードは次のとおりです。
#include <iostream> template <typename T1, typename T2> inline T1 max(T1 const& a, T2 const& b) { return a < b ? b : a; } template <typename T> inline T const& max(T const& a, T const& b) { return 10; }
max 関数の部分的な特殊化とオーバーロードを示します。オーバーロードにより、同じ名前で異なる引数の型を持つ複数の関数が許可されます。
部分特殊化の概念
部分特殊化とは、クラスまたは関数テンプレートが特定のセットに特化されることです。テンプレートパラメータの。クラスの場合、これは、同じ名前でパラメータが少ない特殊なテンプレートを提供することによって実現されます。関数テンプレートの場合、部分特殊化にはテンプレート パラメーターのサブセットのみを指定する必要がありますが、これは現在 C 標準で許可されていません。
部分クラス特殊化の例
クラスの部分的な特殊化は次のようになります:
template <typename T1, typename T2> class MyClass { // ... }; // Partial specialization: both template parameters have the same type template <typename T> class MyClass<T, T> { // ... };
コンパイラー拡張機能
Microsoft Visual Studio 2010 Express などの一部のコンパイラは、関数テンプレートの部分的な特殊化を拡張機能として提供する場合があります。ただし、このような拡張機能を使用すると、他のコンパイラがサポートしていない可能性があるため、コードの移植性が損なわれます。
以上が部分的な関数テンプレートの特殊化またはオーバーロード: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。