2016-05-21 3 views
1

Gibt es bei der folgenden Klassenvorlage eine Möglichkeit, das Feld a für alle Spezialisierungen gleich zu machen (d. H. A<int>::a ist derselbe lvalue wie A<std::string>::a)?Statisches Mitglied, das für alle Vorlagenspezialisierungen freigegeben wird

template<class T> 
class A final { 
private: 
    static int a; 
}; 
+0

fehlt ';' am Ende die Klassendeklaration. – user2296177

+0

@ user2296177 danke, behoben. –

+4

Ja, erben Sie einfach von einer nicht-templateten Basisklasse, die das statische Element speichern würde. – syntagma

Antwort

4

einfach (privat) von einer nicht-Schablone übernehmen und die static dort bewegen:

class ABase { 
protected: 
    static int a; 
}; 

int ABase::a; 

template<class T> 
class A final : private ABase 
{ }; 
+0

Das einzige Problem, das ich damit sehen kann, ist, dass jeder von ABase erben kann ', Gibt es einen Weg, dies zu verhindern? –

+0

Ist hier nicht "endgültig" redundant? – syntagma

+0

@Nicholas Ja - aber ist es die Mühe wert? Verstecke einfach die Basis irgendwo. – Barry

1

Danke an alle, die eine nicht-Templat-Basisklasse vorgeschlagen. Eine ähnliche Lösung, die ich gefunden, dass die Frage eines API Verbraucher entfernt von der Basisklasse erbt sie als letzte Klasse mit der Templat-Klasse als Freund erklärt haben soll:

class A_Data final { 
private: 
    static int a; 

    template<class T> 
    friend class A; 
}; 

template<class T> 
class A final { 
}; 
Verwandte Themen