Pour les cours, oui. Pour les fonctions, non et oui.
La spécialisation de modèle partielle convient aux classes, mais pour les fonctions globales, c'est un peu plus compliqué.
Pour les classes, vous omettez simplement les arguments spécialisés dans la liste des paramètres du modèle et l'inclure dans la définition de classe:
// 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]);
}
};
Pour les fonctions globales, vous ne pouvez pas faire cela. Vous pouvez soit définir une fonction entièrement générale, soit entièrement spécialisée - la spécialisation partielle des fonctions n'est pas autorisée. Toutefois, vous pouvez partiellement spécialiser une fonction en la créant comme proxy pour une fonction statique d'une classe partiellement spécialisée.
par exemple.
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
}
};
Vous pouvez ensuite se spécialiser foo_impl
de quelque façon que vous voulez, et qui sera reflétée dans foo
.