2010-07-07 11 views
9

Ich mache etwas, das wahrscheinlich albern ist, aber es wäre schön, wenn es funktioniert.Gemeinsame statische Mitglieder zwischen Template-Instanziierungen? (unmöglich?)

Ich versuche, Typen so zu spezialisieren, dass ich meine eigene Lookup-Struktur brauche, die im Wesentlichen global ist (aber idealerweise als Klassenvariable gekapselt ist), aber ich möchte, dass die Objekte typsicher sind, also parametrisiert werden.

Folglich habe ich im Wesentlichen

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

und für welchen Gründen auch immer, ich hätte nicht gedacht, so lange, bis ich LookupTable zu initialisieren ging, als ich

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

gibt es Gehen zu viele verschiedene lookupTable s herumlaufen an den verschiedenen Instanziierungen SpecialArray angeschlossen.

Ich vermute, es kann nur ein Wunschtraum sein und die richtige Antwort ist es nur ein separates globales Singleton-Objekt zu machen, aber gibt es sowieso, um es so zu machen, dass es nur einen lookupTable für alle SpecialArray s gibt?

Wie in C++ in meinem Kopf (was nicht wirklich C++ ist), würde dies so etwas wie

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

... gehen, aber leider GCC die C++ in meinem Kopf

nicht kompilieren Gibt es einen tatsächlichen Weg, um zu bekommen, was ich will (irgendwo in C++ 0x-Land oder so)? Ich werde wahrscheinlich auf dieses Problem auch mit einigen statischen Methoden stoßen, die diese Nachschlagetabelle manipulieren (die Typen oder Ns nicht verfolgt).

... Entschuldigung, wenn das keinen Sinn ergeben würde.

Vielen Dank im Voraus für jede Hilfe oder Sympathie, die Sie machen können.

+0

Was ist 'internal_t'? –

+1

Verwandte Frage: [C++ statische Vorlage Mitglied, eine Instanz für jede Vorlage Typ?] (Http://stackoverflow.com/questions/2220975/c-static-template-member-one-instance-for-each-template-type) –

Antwort

18

Sie könnten eine nicht-Templat-Basisklasse hinzufügen und lookupTable in dieser Klasse verschieben:

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

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

Darn - Ich schrieb das, aber zu langsam. Zusätzliche Anmerkung: Wie immer ist die Deklaration von 'lookupTable' innerhalb der Klasse genau das: eine Deklaration. Sie müssen immer noch eine Instanz außerhalb der Klassendefinition definieren ... –

0

Klingt, als ob Sie sie entweder global machen sollten und sich nicht darum kümmern sollten. Vielleicht möchten Sie Namespaces verwenden?