2009-07-22 1 views
10

Возможно ли получить доступ к значениям параметров шаблона непигового типа в специализированном шаблоне?Возможно ли получить доступ к значениям параметров шаблона непигового типа в специализированном классе шаблонов?

Если у меня есть класс шаблона со специализацией:

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

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

Я знаю, что это выше случае просто Кодирую значения 4 и 0 вместо того чтобы использовать переменные, но то, что у меня есть больший класс, который я специализирующуюся и я хотел бы иметь доступ к значениям.

Возможно ли в A < 4,0 для доступа к major и minor значениям (4 и 0)? Или я должен назначить их на шаблон конкретизации как константы:

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

Если вы специализируетесь на значениях, то это означает, что есть что-то особенное в отношении этих конкретных значений. Если вы используете их в качестве общих значений во всем шаблоне и рассматриваете их как специальные в нескольких местах, возможно, вы можете абстрагироваться от специального поведения на меньший шаблон специализированного класса, оставляя большой шаблон полностью универсальным и неспециализированным. Это немного сложно сказать, так что вы можете расширить свой вопрос, чтобы быть более «реальным»? –

+0

Я думаю, что вопрос достаточно велик. У меня есть базовый класс, который реализует конкретное поведение на основе версии протокола. Раньше у него был член, который возвращал версию протокола - поскольку этот элемент больше не был доступен, был метод ведения журнала, который включал в себя версию протокола. Я мог просто жестко кодировать значения, но я хотел знать, есть ли лучший способ. Принятый ответ обеспечивает хороший способ сделать это - я фактически использую черты сходным образом в других местах - для получения типов параметров, но намерение - то же самое. – stefanB

ответ

16

Эта проблема может быть решена имея отдельный набор структур «Черты».

// 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, thanks – stefanB

1

Не совсем ответ на ваш вопрос, но вы могли бы перечислить их, а именно:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

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

Я пытаюсь избежать определения другого набора переменных ... в этом была красота тех параметров шаблона, я обычно не хочу получать доступ к значениям ... но никогда не думаю, но спасибо – stefanB

Смежные вопросы