2009-01-31 12 views

Respuesta

10

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.

4

He utilizado clases de base por lo general cuando se presenta esta situación. Es decir: ponga la funcionalidad común en la clase base, y obtenga la clase de plantilla de ella, luego especialice la clase derivada con solo las funciones que son diferentes.

+0

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 –

Cuestiones relacionadas