मैं मेटाप्रोग्रामिंग का बहुत उपयोग कर रहा हूं, लेकिन कभी-कभी सी मैक्रोज़ और टेम्पलेट्स का संयोजन पर्याप्त नहीं होता है।क्या टेम्पलेट्स के अलावा कोई सी ++ मेटाप्रोग्रामिंग विकल्प हैं?
मुझे लगता है दोष यह संभावित रूप से पार मंच संगतता की कमी हो सकता है अगर metaprogramming मंच, लिनक्स आदि के लिए ही कहते हैं, है
तो, हाँ, इस तरह बात उपलब्ध अभी टेम्पलेट्स के अलावा है? metaprogramming के लिए गूगल खोज टेम्पलेट metaprogramming का प्रभुत्व है, तो यह अभी पता लगाने के लिए मुश्किल है ..
संपादित: यहाँ कुछ मैं पर काम कर रहा है पर एक उदाहरण है।
मान लीजिए कि मेरे पास बफर में फ़ाइलों को सहेजने/लोड करने के लिए एक सामान्य वर्ग है। आइए इसे फाइलपैक कहते हैं।
मैं जो लग रहा है यह मूल रूप से एक वर्ग "BaseClassPack" कहा जाता है, जो एक उपवर्ग होने के लिए परिभाषित किया गया है बनाता है
तरहdefineFilePack(BaseClass, "code-a")
मैक्रो निर्धारित है,। नीचे वह बात है।
class FilePack{
public:
char * thebuffer;
int bufsize;
string packcode;
// and constructors etc
FilePack(const string& thecode, int bufsize);
void operator=(FilePack& rhs);
void saveToFile(const string& filename);
void loadFromFile(const string& filename);
// .. and all the function you'd expect to see in a class like this
};
// the person details
class PersonDetails{
public:
solidstring<64> name;
int age;
DateTime birthday;
// .. yada yada yada
};
defineFilePack(PersonDetails, "psd")
// the above creates the following class
class PersonDetailsPack : public FilePack{
public:
PersonDetailsPack():
FilePack("psd", sizeof(PersonDetails)){ // etc
}
PersonDetails& get(){
return *(PersonDetails*)getBuffer();
}
// and a lot more convenience function
};
अब, वहाँ वास्तव में है कि घोषित कोड आकार के साथ मेल खाता है, एक वैश्विक मानचित्र का उपयोग कर FilePack के निर्माता द्वारा एक में निर्मित की जांच है।
अभी मैं टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करके इसे कैसे करना है, जो वास्तव में इसके लिए उपयुक्त है क्योंकि इन सभी फ़ाइलपैक कोड स्रोत फ़ाइल के अंदर घोषित किए गए हैं। निश्चित रूप से, कोई रन-टाइम में अपना स्वयं का फ़ाइलपैक बना सकता है, लेकिन यह बिंदु के अलावा है।
मेटाप्रोग्रामिंग एक और चीज जो यहां सहायता कर सकती है वह फ़ाइलपैक के विभिन्न संस्करणों को लोड करने का समर्थन करना है। मान लीजिए मैं PersonDetails वर्ग को अद्यतन करने के लिए किया था .. मैं तो बस एक नया वर्ग बनाना, विरासत घोषित करने के लिए metaprogramming किसी तरह का उपयोग करें, और जादुई FilePack पता इतना है कि जब यह PersonDetails के एक पुराने संस्करण लोड हो रहा है यह रूपांतरण समारोह कॉल कर सकते हैं बनाने के लिए, या जो कुछ।
इसके अलावा, आप उस वास्तुकला पर टिप्पणी करने के लिए स्वागत करते हैं, और मैं इसके बारे में कोई टिप्पणी सुनना चाहता हूं, लेकिन यह थोड़ा सा विषय हो सकता है?
क्या आप कुछ ऐसा उदाहरण प्रदान कर सकते हैं जहां टेम्पलेट्स + मैक्रोज़ पर्याप्त नहीं हैं? चर्चा के लिए यह एक अच्छा प्रारंभ बिंदु होगा। –
@ डेविड रोड्रिगेज: उदाहरण के लिए कोड उत्पन्न करना जो नेटवर्क कनेक्शन पर कक्षाओं को क्रमबद्ध करता है या सामान्य रूप से प्रत्येक सदस्य के लिए कुछ करता है। – 6502
"लेकिन कभी-कभी सी मैक्रोज़ और टेम्पलेट्स का संयोजन पर्याप्त नहीं होता है" - क्या गुम है/पर्याप्त नहीं है? – Naveen