C++ ermöglicht dies:
template<typename SYNC>
std::unordered_map<int, std::string> Base<ProductX<SYNC>, SYNC>::s_map { };
nur mit teilweisem Template-Klasse Spezialisierung entspricht. Um dies zu tun, überprüfen Sie bitte Antworten von Columbo und n.m. Benutzer unten. Nachteil ist jedoch, dass Sie für jede ProductX
Klasse, die Sie auf diese Weise erstellen, alles neu definieren müssen. Ie. in meinem Fall, wenn ich Klassen ProductX
, ProductY
, ProductZ
erstellen möchte, muss ich teilweise Spezialisierung für jede von ihnen definieren, einschließlich aller Mitgliedsfunktionen usw., die IMHO nicht sehr praktisch ist.
Falls wir nicht wollen, ganze Klasse Spezialisierung zu schreiben, haben wir entweder statischen Variable ohne-spec Template-Definition verwenden:
template<typename T, typename SYNC>
std::unordered_map<int, std::string> Base<T, SYNC>::s_map { };
oder ganz spezielle Template-Definition:
struct NoSync { };
template<typename NoSync>
std::unordered_map<int, std::string> Base<ProductX<NoSync>, NoSync>::s_map { };
Hier
ist voll Beispiel mit voller Template-Spezialisierung:
//-- CRTP base class with some sync/lock mechanism
template<typename T, typename SYNC>
struct Base {
static std::unordered_map<int, std::string> s_map;
static SYNC s_sync;
static std::string& value_name1(int value) { return s_map[value]; }
};
//-- derived class using CRTP
template<typename SYNC>
struct ProductX : public Base<ProductX<SYNC>, SYNC> {};
struct NoSync {};
//-- static initialisation
template<>
std::unordered_map<int, std::string> Base<ProductX<NoSync>, NoSync>::s_map {
{ 1, "value_1" },
{ 2, "value_2" }
};
int main() {
ProductX<NoSync> p;
std::cout << "Value: " << p.s_map[1] << "\n";
std::cout << "Value: " << p.value_name1(2) << "\n";
}
Dieser wird gut kompilieren.
Ich möchte Columbo und 'n.m."Für ihre Antworten und dafür, dass sie mich in die richtige Richtung weisen! Ich würde Ihre Antworten auswählen, aber ich wollte diese Lösung zeigen, ohne die Spezialisierung der Klassenvorlage zu schreiben.
@Deduplicator - dies ist kein Duplikat dessen, was Sie markiert haben. Wenn Duplikat von etwas, dann von diesem: http://stackoverflow.com/questions/13404695/c-how-to-initialize-static-variables-of-a-partial-template-specialization –