मैं वास्तविक दुनिया परिदृश्यों के लिए टेम्पलेट प्रोग्रामिंग (और भविष्य के बिंदु, टेम्पलेट मेटाप्रोग्रामिंग) पर अपने सिर को प्राप्त करने की कोशिश कर रहा हूं। मुझे लगता है कि एक समस्या यह है कि सी ++ टेम्पलेट्स और पॉलिमॉर्फिज्म हमेशा जिस तरह से मैं चाहता हूं उसे एक साथ नहीं खेलता।ओओ polymorphism के स्थान पर टेम्पलेट polymorphism का उपयोग किया जा सकता है?
मेरा प्रश्न यह है कि जिस तरह से मैं टेम्पलेट प्रोग्रामिंग लागू करने की कोशिश कर रहा हूं वह अनुचित है (और मुझे सादे पुराने ओओपी का उपयोग करना चाहिए) या यदि मैं अभी भी ओओपी मानसिकता में फंस गया हूं।
इस विशेष मामले में, मैं रणनीति-पैटर्न का उपयोग कर समस्या हल करने का प्रयास कर रहा हूं। मैं उस समस्या में भागता रहता हूं जहां मैं कुछ ऐसा करना चाहता हूं जो पॉलिमॉर्फिक व्यवहार करता है जो टेम्पलेट्स का समर्थन नहीं करता है।
OOP कोड का उपयोग कर रचना:
class Interpolator {
public:
Interpolator(ICacheStrategy* const c, IDataSource* const d);
Value GetValue(const double);
}
void main(...) {
Interpolator* i;
if(param==1)
i = new Interpolator(new InMemoryStrategy(...), new TextFileDataSource(...));
else if(param==2)
i = new Interpolator(new InMemoryStrategy(...), new OdbcDataSource(...));
else if(param==3)
i = new Interpolator(new NoCachingStrategy(...), new RestDataSource(...));
while(run) {
double input = WaitForRequest();
SendRequest(i->GetValue(input));
}
}
संभावित खाका संस्करण:
class Interpolator<class TCacheStrategy, class TDataSource> {
public:
Interpolator();
Value GetValue(const double); //may not be the best way but
void ConfigCache(const& ConfigObject); //just to illustrate Cache/DS
void ConfigDataSource(const& ConfigObject); //need to configured
}
//Possible way of doing main?
void main(...) {
if(param==1)
DoIt(Interpolator<InMemoryStrategy,TextFileDataSource>(),c,d);
else if(param==2)
DoIt(Interpolator<InMemoryStrategy,OdbcDataSource>(),c,d)
else if(param==3)
DoIt(Interpolator<NoCachingStrategy,RestDataSource>(),c,d)
}
template<class T>
void DoIt(const T& t, ConfigObject c, ConfigObject d) {
t.ConfigCache(c);
t.ConfigDataSource(c);
while(run) {
double input = WaitForRequest();
SendRequest(t.GetValue(input));
}
}
जब मैं एक टेम्पलेट आधारित कार्यान्वयन के लिए OOP कार्यान्वयन बदलने की कोशिश, क्षेपक कोड एक के बिना अनुवाद किया जा सकता बहुत दर्द असल में, टेम्पलेट प्रकार पैरामीटर के साथ "इंटरफेस" को प्रतिस्थापित करें, और स्ट्रैटेजी/डेटासोर्स या कॉन्फ़िगरेशन पैरामीटर के उदाहरण में पास करने के लिए एक तंत्र जोड़ें।
लेकिन जब मैं "मुख्य" पर जाता हूं, तो यह मुझे स्पष्ट नहीं है कि टेम्पलेट मेटा प्रोग्रामिंग की शैली में टेम्पलेट का लाभ उठाने के लिए इसे कैसे लिखा जाना चाहिए। मैं अक्सर बहुरूपता का उपयोग करना चाहता हूं, लेकिन यह टेम्पलेट्स के साथ अच्छी तरह से खेलना प्रतीत नहीं होता है (कभी-कभी ऐसा लगता है कि मुझे जावा के टाइप-एरर जेनरिक की आवश्यकता है ... यूघ)।
जब मुझे अक्सर लगता है कि मैं ऐसा करना चाहता हूं तो TemplateType<?,?> x = new TemplateType<X,Y>()
जैसा कुछ है, जहां x X, Y है।
वास्तव में, टेम्पलेट का उपयोग करते समय यह अक्सर मेरी समस्या होती है।
- क्या मुझे टेम्पलेट्स का एक और स्तर लागू करने की आवश्यकता है?
- क्या मैं पर अपने चमकदार नए पावर टेम्पलेट रिंच का उपयोग करने की कोशिश कर रहा हूं, एक पीसीआई स्लॉट में ओओपी नाखून स्थापित करें?
- या क्या मैं टेम्पलेट प्रोग्रामिंग की बात करते समय यह सब गलत सोच रहा हूं?
[संपादित करें] कुछ लोगों ने इंगित किया है कि यह वास्तव में टेम्पलेट मेटाप्रोग्रामिंग नहीं है इसलिए मैंने प्रश्न को थोड़ा सा हल किया है। शायद यह समस्या का हिस्सा है - मैंने अभी तक टीएमपी वास्तव में क्या किया है।
+1 यह इंगित करने के लिए कि यह टेम्पलेट मेटा-प्रोग्रामिंग नहीं है। –