C++ Bu sağlar:
template<typename SYNC>
std::unordered_map<int, std::string> Base<ProductX<SYNC>, SYNC>::s_map { };
sadece kısmi şablon sınıf uzmanlık karşılık gelen. Bunları yapmak için lütfen Columbo ve n.m. Aşağıdaki kullanıcılar. Bununla birlikte, dezavantaj, bu şekilde oluşturduğunuz her ProductX
sınıfı için her şeyi yeniden tanımlamanız gerektiğidir. Yani. Benim durumumda, ProductX
, ProductY
, ProductZ
sınıflarını oluşturmak istiyorsam, çok pratik IMHO olmayan tüm üye işlevleri de dahil olmak üzere her biri için kısmi uzmanlık tanımlamanız gerekecek.
template<typename T, typename SYNC>
std::unordered_map<int, std::string> Base<T, SYNC>::s_map { };
veya tamamen özelleşmiş şablon tanımı:
struct NoSync { };
template<typename NoSync>
std::unordered_map<int, std::string> Base<ProductX<NoSync>, NoSync>::s_map { };
biz bütün sınıf uzmanlık yazmak istemiyorum durumda
, hiçbir özellikli şablon tanımıyla ya statik değişkeni kullanmak zorunda
//-- 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";
}
Bu seferki:
İşte tam şablon uzmanlık ile tam bir örnektir iyi derler.
Columbo ve 'n.m'ye teşekkür ederim.'onların cevapları için ve doğru yönde bana işaret için! Cevaplarınızı seçerdim, ancak bu çözümü sınıf şablonu uzmanlığı yazmadan göstermek istedim.
@Deduplicator - Bu, işaretlediğiniz şeyin kopyası değildir. Eğer bir şeyin kopyası varsa, bundan sonra: http://stackoverflow.com/questions/13404695/c-how-to-initialize-static-variables-of-a-partial-template-specialization –