Usted puede especializarse totalmente un miembro de forma selectiva:
template<int N>
struct Vector {
int calculate() { return N; }
};
// put into the .cpp file, or make inline!
template<>
int Vector<3>::calculate() { return -1; }
haces una especialización completa. Lo que significa que no puede parcial especializas que:
template<int N, int P>
struct Vector {
int calculate() { return N; }
};
// WROOONG!
template<int N>
int Vector<N, 3>::calculate() { return -1; }
Si necesita eso, se puede utilizar enable_if:
template<int N, int P>
struct Vector {
int calculate() { return calculate<P>(); }
private:
// enable for P1 == 3
template<int P1>
typename enable_if_c<P1 == P && P1 == 3, int>::type
calculate() { return -1; }
// disable for P1 == 3
template<int P1>
typename enable_if_c<!(P1 == P && P1 == 3), int>::type
calculate() { return N; }
};
Un enfoque alternativo es dividir tus cosas (cosas comunes en una clase base, y especializada cosas en la clase derivada) como recomienda Nick.
Normalmente tomaría el segundo enfoque. Pero prefiero el primero si no necesito especializar parcialmente las funciones.
Para obtener información más detallada sobre esto, consulte "Artículo 44: Código independiente de parámetro de parámetro de plantillas" en "Effective C++, Third Edition" de Scott Meyers –