C++ permette questo:
template<typename SYNC>
std::unordered_map<int, std::string> Base<ProductX<SYNC>, SYNC>::s_map { };
solo con corrispondenti parziale specializzazione classe template. Per fare ciò, si prega di controllare le risposte di Columbo e nm. utenti di seguito. Tuttavia, lo svantaggio è che devi ridefinire tutto per ogni classe ProductX
che crei in questo modo. Vale a dire. nel mio caso, se voglio creare le classi ProductX
, ProductY
, ProductZ
, dovrò definire una specializzazione parziale per ognuna di esse, incluse tutte le funzioni membro ecc., che non è molto pratico IMHO.
Nel caso in cui non vogliamo scrivere tutta la classe di specializzazione, dobbiamo utilizzare sia variabile statica senza-spec definizione del modello:
template<typename T, typename SYNC>
std::unordered_map<int, std::string> Base<T, SYNC>::s_map { };
o completamente specializzata definizione del modello:
struct NoSync { };
template<typename NoSync>
std::unordered_map<int, std::string> Base<ProductX<NoSync>, NoSync>::s_map { };
Qui è pieno esempio con piena modello di specializzazione:
//-- 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";
}
Questo compilerà bene.
Vorrei ringraziare Columbo e il giorno'per le loro risposte e per avermi indicato nella giusta direzione! Selezionerei le tue risposte, ma volevo mostrare questa soluzione senza scrivere la specializzazione del modello di classe.
@Deduplicator - questo non è un duplicato di ciò che hai contrassegnato. Se duplicato di qualcosa, allora di questo: http://stackoverflow.com/questions/13404695/c-how-to-initialize-static-variables-of-a-partial-template-specialization –