तो यह मेटाप्रोग्राम तेज़ है ... कॉन्स्टेंट लिटलल का बीकॉज़। लेकिन: असली दुनिया में जहां हमारे पास लगातार साहित्य हैं? अधिकांश प्रोग्राम जो मैं उपयोगकर्ता इनपुट पर प्रतिक्रिया का उपयोग करता हूं।
यही कारण है कि यह शायद ही कभी मूल्यों के लिए उपयोग किया जाता है। आमतौर पर, यह प्रकारों पर प्रयोग किया जाता है। नए प्रकारों की गणना और उत्पन्न करने के लिए प्रकारों का उपयोग करना।
कई वास्तविक दुनिया के उपयोग हैं, जिनमें से कुछ आप पहले ही परिचित हैं, भले ही आपको इसका एहसास न हो।
मेरे पसंदीदा उदाहरणों में से एक इटरेटर का है। वे ज्यादातर जेनेरिक प्रोग्रामिंग के साथ डिजाइन किए जाते हैं, हां, लेकिन टेम्पलेट मेटाप्रोग्रामिंग विशेष रूप से एक ही स्थान पर उपयोगी है:
पॉइंटर्स को पैच करने के लिए ताकि उन्हें इटरेटर के रूप में उपयोग किया जा सके। एक पुनरावर्तक को value_type
जैसे कुछ प्रकार के टाइपपीफ का पर्दाफाश करना चाहिए। पॉइंटर्स ऐसा नहीं करते हैं।
जैसे कि निम्न (मूल रूप से आप Boost.Iterator में क्या लगता है के समान)
template <typename T>
struct value_type {
typedef typename T::value_type type;
};
template <typename T>
struct value_type<T*> {
typedef T type;
};
एक बहुत ही सरल टेम्पलेट metaprogram है, लेकिन जो के रूप में
तो कोड बहुत उपयोगी है। यह आपको किसी भी इटरेटर प्रकार टी के मान प्रकार को प्राप्त करने देता है, चाहे वह एक सूचक या वर्ग हो, बस value_type<T>::type
द्वारा।
और मुझे लगता है कि उपरोक्तता के आने पर ऊपर दिए गए कुछ स्पष्ट लाभ हैं। आपके एल्गोरिदम केवल इटरेटर्स पर काम कर रहे हैं केवल एक बार लागू किया जाना है। इस चाल के बिना, आपको पॉइंटर्स के लिए एक कार्यान्वयन करना होगा, और दूसरा "उचित" वर्ग-आधारित इटरेटर्स के लिए।
boost::enable_if
जैसे ट्रिक्स भी बहुत मूल्यवान हो सकते हैं। आपके पास एक फ़ंक्शन का अधिभार है जिसे केवल विशिष्ट प्रकार के प्रकार के लिए सक्षम किया जाना चाहिए। प्रत्येक प्रकार के लिए ओवरलोड को परिभाषित करने के बजाय, आप स्थिति निर्दिष्ट करने के लिए मेटाप्रोग्रामिंग का उपयोग कर सकते हैं और इसे enable_if
पर पास कर सकते हैं।
ईरविकर ने पहले से ही एक और अच्छा उदाहरण, भौतिक इकाइयों और आयामों को व्यक्त करने के लिए एक ढांचा का उल्लेख किया है। यह आपको भौतिक इकाइयों से जुड़ी गणनाओं को व्यक्त करने की अनुमति देता है, और परिणाम प्रकार को लागू करता है। मीटर से मीटर गुणा करने से कई वर्ग मीटर पैदा होते हैं। टेम्पलेट मेटाप्रोग्रामिंग का उपयोग सही प्रकार के सही प्रकार के उत्पादन के लिए किया जा सकता है।
लेकिन अधिकांश समय, टेम्पलेट मेटाप्रोग्रामिंग का उपयोग छोटे, अलग मामलों में किया जाता है, मूल रूप से बाधाओं और असाधारण मामलों को सुचारु बनाने के लिए, प्रकारों का एक सेट बनाने और समान व्यवहार करने के लिए, जो आपको सामान्य प्रोग्रामिंग का उपयोग करने की अनुमति देता है अधिक कुशलता से
यह मुझे कभी ज्यादा समझ में नहीं आया ... – Kawa
बुरा मत समझो, शायद ही कोई इसे प्राप्त करता है। –