क्या किसी को व्युत्पन्न कक्षाएं बनाने के तरीके को स्वचालित रूप से टेम्पलेट प्रकार के साथ एक स्थिर चर को तुरंत चालू करने के बारे में पता है (या तो व्युत्पन्न वर्ग के लेखक से कुछ भी आवश्यकता नहीं है, या उसे इस स्थिर को कॉल करने के लिए मजबूर करना पड़ता है व्युत्पन्न कक्षा परिभाषा वैध बनाने के लिए विधि)।व्युत्पन्न प्रकारों का स्वत: स्थैतिक आमंत्रण
यह समझना असंभव है, मैं इसे बेहतर तरीके से परिभाषित करने और परिभाषित करने की कोशिश करूंगा।
असल में मेरे पास एक वैश्विक फैक्ट्री क्लास है जिसमें एक टेम्पलेटेड फ़ंक्शन है जिसे रजिस्टर टाइप कहा जाता है। एंटिटी से व्युत्पन्न प्रत्येक वर्ग के लिए, मुझे इस फ़ंक्शन को व्युत्पन्न प्रकार के टेम्पलेट पैरामीटर के साथ कॉल करने की आवश्यकता है। फिलहाल, मुझे इसे कुछ init फ़ंक्शन में मैन्युअल रूप से करना है, जिसके परिणामस्वरूप इस फ़ंक्शन पर कॉल का एक बड़ा ब्लॉक होता है, जो मेरे लिए टेम्पलेट्स के सिद्धांत के खिलाफ जाता है।
तो मैं इस है:
class Factory
{
template <typename EntityType>
registerEntityType();
};
void someInitFunction()
{
/// All of these are derived from Entity
gFactory.registerEntityType<EntityType1>();
gFactory.registerEntityType<EntityType2>();
gFactory.registerEntityType<EntityType3>();
/// and so on
}
जबकि मैं नहीं बल्कि इस लिए होता है:
class Factory
{
template <typename EntityType>
registerEntityType();
};
class Entity // Abstract
{
/// This function should be called automatically with the derived
/// type as a parameter
SomeStaticConstructor<MDerivedType>()
{
gFactory.registerEntityType<MDerivedType>();
}
};
संपादित करें:
यह: यह स्थिर आवर्ती टेम्पलेट कोड है कि काम नहीं कर रहा है मेरी बेस क्लास है, और स्वचालित रूप से सामान पंजीकृत करने के लिए कक्षा
template <typename DerivedType>
class Registrar
{
public:
Registrar();
void check();
};
template <typename Product, typename DerivedType>
class AbstractFactory: public AbstractFactoryBase<Product>
{
public:
AbstractFactory();
~AbstractFactory();
private:
static Registrar<DerivedType> registrar;
};
रजिस्ट्रार के निर्माता
template <typename DerivedType>
Registrar<DerivedType>::Registrar()
{
std::cout << DerivedType::name() << " initialisation" << std::endl;
g_AbstractFactories.registerFactoryType<DerivedType>(DerivedType::name());
}
और एक व्युत्पन्न प्रकार
class CrateFactory : public AbstractFactory<Entity, CrateFactory>
{
public:
CrateFactory(FactoryLoader* loader);
virtual ~CrateFactory();
Entity* useFactory(FactoryParameters* parameters);
static std::string name()
{
return "CrateFactory";
}
पहले पथ मैं नीचे चलने चाहते हैं, 'बनाने Entity' एक टेम्पलेट वर्ग है तो यह व्युत्पन्न प्रकार जानता है । व्युत्पन्न प्रकारों की समस्या या तो स्वयं टेम्पलेट्स (और इस प्रकार सार हो) होनी चाहिए, या बेस क्लास के रूप में कभी भी उपयोग नहीं किया जाना चाहिए। मैंने Win32 रैपर पुस्तकालयों में इसके लिए मैक्रोज़ भी उपयोग किए हैं। और, यह प्रश्न कुछ हद तक संबंधित है - http://stackoverflow.com/questions/138600/initializing-a-static-stdmapint-int-in-c –
एनएम, ऐसा लगता है कि इसे सीआरटीपी कहा जाता है, और जवाबों ने कब्जा कर लिया जो मैं था हो रहा है :) –