2010-07-07 13 views
9

Estoy haciendo algo que probablemente sea una tontería, pero estaría bien si funcionara.¿Compartir miembros estáticos entre instancias de plantilla? (imposible?)

Estoy intentando especializar tipos de una manera que necesito mi propia estructura de búsqueda que es esencialmente global (pero idealmente encapsulada como una variable de clase), pero quiero que los objetos sean de tipo seguro, por lo que están parametrizados.

En consecuencia, tengo, esencialmente

template<class T, int N> 
class SpecialArray 
{ 
//... 
private: 
    static map<string, internal_t> lookupTable 
} 

y por cualquier motivo, no pensé que hasta el momento en que fui a inicializar LookupTable que cuando digo

template <class T, int N> 
SpecialArray<T,N>::lookupTable; 

existen va a haber muchos lookupTable s corriendo alrededor de las distintas instancias de SpecialArray.

Sospecho que puede ser solo un sueño y que la respuesta correcta es simplemente convertirlo en un objeto singleton global por separado, pero ¿hay alguna forma de que solo haya un lookupTable para todos los SpecialArray s?

Al igual que, en el C++ en mi mente (que no es real C++), esto sería algo como

template <class T, int N> 
SpecialArray<*,*>::lookupTable; 

... pero lamentablemente GCC no se compila el C++ en mi mente

¿Hay alguna forma real de obtener lo que quiero (en algún lugar de C++ 0x-land o algo así)? Es probable que encuentre este problema también con algunos métodos estáticos que manipulan esta tabla de búsqueda (que no hace un seguimiento de los tipos o Ns).

... disculpa si eso no tenía ningún sentido.

Gracias de antemano por cualquier ayuda o simpatía que pueda brindar.

+0

¿Cuál es 'internal_t'? –

+1

pregunta relacionada: [¿Miembro de plantilla estática de C++, una instancia para cada tipo de plantilla?] (Http://stackoverflow.com/questions/2220975/c-staticover-template-member-one-instance-for-each-template-type) –

Respuesta

18

Se podría añadir una clase base no moldeado y mover lookupTable en esa clase:

class Base 
{ 
protected: 
    static map<string, internal_t> lookupTable 
}; 

template<class T, int N> 
class SpecialArray : Base 
{ 
    //... 
}; 
+1

Darn - Estaba escribiendo eso, pero muy lentamente. Nota adicional: como siempre, la declaración de 'lookupTable' dentro de la clase es solo eso: una declaración. Aún necesita definir una instancia de él fuera de la definición de la clase ... –

0

Parece que deberías hacerlos globales y no preocuparte por ello. Quizás usar espacios de nombres es lo que quieres?

Cuestiones relacionadas