2009-01-31 7 views

risposta

10

È possibile specializzarsi completamente un membro selettivamente:

template<int N> 
struct Vector { 
    int calculate() { return N; } 
}; 

// put into the .cpp file, or make inline! 
template<> 
int Vector<3>::calculate() { return -1; } 

che fai una specializzazione completa. Significa che non si può parziale specializzarla:

template<int N, int P> 
struct Vector { 
    int calculate() { return N; } 
}; 

// WROOONG! 
template<int N> 
int Vector<N, 3>::calculate() { return -1; } 

Se avete bisogno di questo, si può utilizzare 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 approccio alternativo è quello di dividere la vostra roba (roba comune in una classe di base, e specializzata roba nella classe derivata) come Nick raccomanda.

Di solito prenderei il secondo approccio. Ma preferisco il primo se non ho bisogno di specializzare parzialmente le funzioni.

4

Ho usato le classi base di solito quando si verifica questa situazione. Vale a dire: inserire la funzionalità comune nella classe base e derivarne la classe template, quindi specializzare la classe derivata con solo le funzioni che sono differenti.

+0

Per informazioni più dettagliate su questo, vedere "Elemento 44: codice indipendente dai parametri del parametro fuori dai modelli" in "Effective C++, Third Edition" di Scott Meyers –