2009-07-22 14 views
10

¿Es posible acceder a los valores de los parámetros de plantilla sin tipo en la clase de plantilla especializada?¿Es posible acceder a valores de parámetros de plantilla sin tipo en la clase de plantilla especializada?

Si tengo clase de plantilla con la especialización:

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

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

sé que el caso anterior es fácil de codificar los valores 4 y 0 en lugar de utilizar variables, pero lo que tengo una clase más grande que estoy especializada y me gustaría poder acceder a los valores.

¿Es posible en A < 4,0> acceder a los valores major y minor (4 y 0)? O tengo que asignarlos a instancias de plantilla como constantes:

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

Si se está especializando en valores, implica que hay algo especial sobre esos valores en particular. Si los está utilizando como valores generales en toda la plantilla y solo los trata como especiales en algunos lugares, puede ser que pueda abstraer el comportamiento especial en una plantilla de clase especializada más pequeña, dejando la plantilla grande como completamente genérica y no especializada. Es un poco difícil de decir, ¿puedes ampliar tu pregunta para que sea más "real"? –

+0

Creo que la pregunta es bastante real. Tengo una clase base existente que implementa un comportamiento específico basado en la versión del protocolo. Anteriormente tenía un miembro que devolvía la versión de protocolo: como ese miembro ya no estaba disponible, había un método de registro que incluía la versión de protocolo en el resultado. Podría codificar los valores, pero quería saber si hay una mejor manera. La respuesta aceptada proporciona una buena manera de hacerlo (en realidad, estoy usando rasgos de manera similar en otros lugares) para obtener los tipos de parámetros, pero la intención es la misma. – stefanB

Respuesta

16

Este tipo de problema puede ser resuelto teniendo un conjunto separado de estructuras de "Rasgos".

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

1
No

realmente una respuesta a su pregunta, pero usted podría enumerarlos, a saber:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

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

Estoy tratando de evitar la definición de otro conjunto de variables ... esa era la belleza de tener esos parámetros de plantilla, normalmente no quiero acceder a los valores ... pero no importa, pero gracias – stefanB

Cuestiones relacionadas