2009-07-22 18 views
10

Özel şablon sınıfındaki tip olmayan şablon parametrelerinin değerlerine erişmek mümkün mü? Ben uzmanlaşma ile şablon varsa sınıfıÖzel şablon sınıfındaki tip olmayan şablon parametrelerinin değerlerine erişmek mümkün mü?

:

template <int major, int minor> struct A { 
     void f() { cout << major << endl; } 
    } 

    template <> struct A<4,0> { 
     void f() { cout << ??? << endl; } 
    } 

ben o yukarıdaki durum biliyorum değerleri 4 ve 0 yerine kullanarak değişkenleri ama ne ben uzmanlaşmış ediyorum daha büyük bir sınıf var kodlamalısınız basittir ve değerlere erişebilmek istiyorum.

< 4,0>major ve minor değerlerine (4 ve 0) erişmek mümkün mü? Ya da sabitler olarak şablon örneği başlatıldığında onları atamak zorunda yapın: gerçekten

template <> struct A<4,0> { 
     static const int major = 4; 
     static const int minor = 0; 
     ... 
    } 
+0

Değerlere göre uzmanlaşıyorsanız, bu özel değerler hakkında özel bir şey olduğunu ima eder. Bunları şablonun genelinde genel değerler olarak kullanıyor ve yalnızca birkaç yerde özel olarak ele alıyorsanız, özel davranışı daha büyük bir uzmanlık sınıfı şablonuna ayırabilmeniz, büyük şablonu tamamen jenerik ve uzmanlık dışı bırakabilirsiniz. Söylemesi biraz zor, bu yüzden sorunuzu 'gerçek' olmak için genişletebilir misin? –

+0

Sanırım soru yeterince gerçek. Protokol versiyonuna dayanan spesifik davranışı uygulayan mevcut temel sınıfım var. Daha önce protokol versiyonunu döndüren bir üye vardı - bu üye artık mevcut olmadığı için çıktıda protokol versiyonunu içeren bir kayıt yöntemi vardı. Değerleri sadece kodlayabilirdim ama daha iyi bir yol olup olmadığını öğrenmek istedim. Kabul edilen cevap, bunu yapmanın iyi bir yolunu sunuyor - Aslında diğer yerlerde benzer şekilde özellikleri kullanıyorum - parametre türlerini almak için ama niyet aynı. – stefanB

cevap

16

problemin Bu tür çözülebilir Ayrı bir "Traits" yapısı kümesine sahip olmak.

// A default Traits class has no information 
template<class T> struct Traits 
{ 
}; 

// A convenient way to get the Traits of the type of a given value without 
// having to explicitly write out the type 
template<typename T> Traits<T> GetTraits(const T&) 
{ 
    return Traits<T>(); 
} 

template <int major, int minor> struct A 
{ 
    void f() 
    { 
     cout << major << endl; 
    } 
}; 

// Specialisation of the traits for any A<int, int> 
template<int N1, int N2> struct Traits<A<N1, N2> > 
{ 
    enum { major = N1, minor = N2 }; 
}; 

template <> struct A<4,0> 
{  
    void f() 
    { 
     cout << GetTraits(*this).major << endl; 
    } 
}; 
+0

+1 nice, teşekkürler – stefanB

1

Değil sorunuzun cevabı, ancak, yani onları numaralandırmak olabilir:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

template <> struct A<specialisationMajor,specialisationMinor> { 
    static const int major = specialisationMajor; 
    static const int minor = specialisationMinor; 
    ... 
} 
+0

Başka bir değişken kümesi tanımlamaktan kaçınmaya çalışıyorum ... bu şablon parametrelerine sahip olmanın güzelliğiydi, genellikle değerlere erişmek istemiyorum ... ama boşuna, ama teşekkürler – stefanB

İlgili konular