2009-07-22 7 views
10

Czy możliwe jest uzyskanie dostępu do wartości parametrów szablonu non-type w specjalnej klasie szablonów?Czy możliwe jest uzyskanie dostępu do wartości parametrów szablonu non-type w specjalnej klasie szablonów?

Jeśli mam klasy szablonu specjalizacji:

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

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

Wiem, że powyższy przypadek, to jest proste hardcode wartości 4 i 0 zamiast przy użyciu zmiennych lecz co mam większą klasę, że jestem specjalizującą i chciałbym móc uzyskać dostęp do wartości.

Czy w A < 4,0> można uzyskać dostęp do wartości major i minor (4 i 0)? Czy muszę przypisać je na szablonie instancji jako stałe:

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

Jeśli specjalizujesz się w oparciu o wartości, oznacza to, że w tych konkretnych wartościach jest coś szczególnego. Jeśli używasz ich jako ogólnych wartości w całym szablonie i traktujesz je jako specjalne tylko w kilku miejscach, może to oznaczać, że możesz oddzielić specjalne zachowanie na mniejszy wyspecjalizowany szablon klasy, pozostawiając duży szablon jako w pełni ogólny i niespecyficzny. Trudno powiedzieć, czy możesz rozwinąć swoje pytanie, aby było bardziej "prawdziwe"? –

+0

Myślę, że pytanie jest wystarczająco prawdziwe. Mam istniejącą klasę bazową, która implementuje określone zachowanie w oparciu o wersję protokołu. Poprzednio miał członka, który zwrócił wersję protokołu - ponieważ ten członek nie był już dostępny, istniała metoda logowania, która zawierała wersję protokołu na wyjściu. Mogłem po prostu zakodować wartości, ale chciałem się dowiedzieć, czy jest lepszy sposób. Przyjęta odpowiedź zapewnia dobry sposób robienia tego - w rzeczywistości używam cech w podobny sposób w innych miejscach - w celu uzyskania typów parametrów, ale intencja jest taka sama. – stefanB

Odpowiedz

16

Tego rodzaju problem może być rozwiązany poprzez oddzielny zestaw struktur "Cechy".

// 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 miłe, dzięki – stefanB

1

Niezupełnie odpowiedź na swoje pytanie, ale można wyliczyć je, a mianowicie:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

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

Próbuję unikać definiowania innego zestawu zmiennych ... to było piękno posiadania tych parametrów szablonu, nie chcę zazwyczaj mieć dostępu do wartości ... ale nieważne, ale dzięki – stefanB

Powiązane problemy