2009-01-31 21 views
5

Bir sınıf şablonunu uzmanlaştırmak için, çoğunlukla değişmeden kalması beklense bile, temel alt şablondaki (yani uzman olmayan sınıf şablonu) tüm üye işlevlerinin yeniden tanımlanması gerekir. Bu kod çoğaltmasını önlemek için kabul edilen yöntemlerden ve "en iyi uygulamalardan" bazıları nelerdir?Şablon Uzmanlığı ve Sonuç Kodunun Çoğaltılması ile İlgili Bir Soru

Teşekkürler.

cevap

10

Tam olarak seçici bir üyeyi uzmanlaşabilir:

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

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

Tam bir ihtisas yapmak. Bunu gerekiyorsa, enable_if kullanabilirsiniz

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

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

:

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; } 
}; 

alternatif bir yaklaşım, bir temel sınıf içine (yaygın malzeme eşyalarını bölmek ve uzman Anlamı kısmi bunu uzmanlaşmak olamaz Nick'in önerdiği gibi türetilmiş bir sınıfa.

Genellikle ikinci yaklaşımı alırdım. Ama eğer kısmi fonksiyonları uzmanlaşmaya ihtiyacım yoksa ilkini tercih ederim.

4

Genellikle bu durum ortaya çıktığında temel sınıfları kullandım. Yani: temel sınıftaki ortak işlevselliği ortaya koyun ve şablon sınıfını bundan türetin, sonra türetilmiş sınıfı yalnızca farklı işlevlerle özelleştirin.

+0

Daha ayrıntılı bilgi için, bkz. "Öğe 44: Şablondan bağımsız, parametreden bağımsız kod şablonları" Scott Meyers'ın "Etkin C++, Üçüncü Sürüm" –

İlgili konular