クラスについては、はい。関数の場合は、いいえとはい。
クラスの部分的なテンプレートの特殊化は問題ありませんが、グローバル関数の場合はもう少し注意が必要です。
クラスの場合、テンプレート パラメーター リストから特殊な引数を省略し、それをクラス定義に含めます。
// General template class for a vector
template <class T, int N>
struct Vector
{
T e[N];
};
// Specialization for N=3
template <class T> // omit the N
struct Vector<T, 3> // and include it here
{
T e[3];
static Vector<T, 3> cross(const Vector<T, 3>& a, const Vector<T, 3>& b)
{
return Vector<T, 3>( a.e[1] * b.e[2] - a.e[2] * b.e[1],
a.e[2] * b.e[0] - a.e[0] * b.e[2],
a.e[0] * b.e[1] - a.e[1] * b.e[0] );
}
};
グローバル関数の場合、それはできません。完全に一般的な関数または完全に特殊化された関数を定義できます。関数の部分的な特殊化は許可されていません。
ただし、部分的に特化されたクラスの静的関数のプロキシとして関数を作成することにより、関数を部分的に特化することができます。
例えば
template <class A, class B>
void foo(A a, B b)
{
foo_impl::fun(a, b);
}
template <class A, class B>
struct foo_impl
{
static void fun(A a, B b)
{
// real implementation here
}
};
その後、好きなように専門化することができ、foo_impl
それが に反映されfoo
ます。