プライマリテンプレートの場合:
template<typename A, typename B> class MyClass {...
テンプレートの特殊化では、違いは何ですか
template<typename A, typename B> class MyClass<int, float> {...
と
template<> class MyClass<int, float> {...
プライマリテンプレートの場合:
template<typename A, typename B> class MyClass {...
テンプレートの特殊化では、違いは何ですか
template<typename A, typename B> class MyClass<int, float> {...
と
template<> class MyClass<int, float> {...
template<typename A, typename B> class MyClass<int, float> {...
許可されるべきではありません。実際、正式なパラメータA
とを指定する場合B
、テンプレートはそれらを使用する必要があります。
2番目のケースはごく普通のことです。つまり、「自由」パラメーターなしで特殊化を行っていると言います。
中間のケースは
template<typename A> class MyClass<A, float> {...
これも有効です。ここでは、2番目のテンプレートパラメータのみを修正しています。
部分的な特殊化の考え方は次のとおりです。いくつかの正式なパラメーターを使用してテンプレートを作成し、それらを使用して初期テンプレートのパラメーターの制約を表現します。部分特殊化のパラメーターは、初期テンプレートパラメーターと同じである必要はありません。例:
template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...
あなたのケースに有効な部分的な特殊化になります。これは、「任意のタイプの場合X
、Y
およびのテンプレートパラメータが一致する場合は、この特殊化を使用する」と読むことができます。コンパイラは、型パターンに一致させるために非常に巧妙である必要があります。Z
MyClass
X*
Y(Z&)