हम टेम्पलेट टेम्पलेट मापदंडों को छोड़ देते हैं

C ++ बॉयलरप्लेट टेम्पलेट मापदंडों का उपयोग करना काफी कठिन है। मैं बढ़ावा देने की शक्ति का प्रदर्शन करना चाहता हूं :: mpl और एक चाल दिखाता हूं जो आपको टेम्पलेट्स का वर्णन करने की अनुमति देता है, पूरी तरह से टेम्पलेट टेम्पलेट मापदंडों को छोड़ देता है।
मैं समस्या का प्रदर्शन करूंगा। एक वर्ग है जो एक वस्तु प्रकार और इस वस्तु के लिए एक कंटेनर प्रकार स्वीकार करता है।
template <typename T, typename Container> struct A { typedef Container<T> type; }; 

आप ऐसा नहीं लिख सकते हैं, आपको यह दर्शाने के लिए टेम्पलेट टेम्प्लेट मापदंडों का उपयोग करना चाहिए कि Container स्वयं एक टेम्प्लेट है।

इस तरह से सही लिखें:
 template <typename T, template<typename> class Container> struct A { typedef Container<T> type; }; 

इस तरह का उपयोग करें:
 typedef A<int, std::vector>::type type; 

पहले उपयोग पर, हमें एक संकलन त्रुटि मिलती है। हम भूल गए कि std :: वेक्टर दो मापदंडों को लेता है, जिनमें से एक आमतौर पर डिफ़ॉल्ट रूप से उपयोग किया जाता है। ठीक है, फिर से लिखना:
 template <typename T, template<typename, typename> class Container> struct A { typedef Container<T, std::allocator<T> > type; }; 

दो स्पष्ट समस्याएं हैं:
  1. हमें std :: वेक्टर के कार्यान्वयन पर ध्यान देने की आवश्यकता है, यह पता करें कि डिफ़ॉल्ट रूप से किस प्रकार के आवंटनकर्ता का उपयोग किया जाता है, और फिर इसका उपयोग करें।
  2. यदि हमने कंटेनर को लिखा है तो वह काम नहीं करेगा यदि कंटेनर में एक से अधिक डिफ़ॉल्ट टेम्पलेट पैरामीटर हैं।

मैं स्पष्ट रूप से डिफ़ॉल्ट प्रकार और टेम्पलेट टेम्पलेट पैरामीटर के जटिल सिंटैक्स को निर्दिष्ट करने से बचना चाहूंगा। बढ़ावा देने के उपयोग पर आधारित एक तकनीक :: lplda metafunctions बनाने के लिए उपयोग किए जाने वाले mpl प्लेसहोल्डर बचाव के लिए आते हैं।

बाह्य रूप से, एकमात्र अंतर यह है कि हमें कंटेनर टेम्पलेट को अपने टेम्पलेट में स्थानांतरित करने की आवश्यकता नहीं है, लेकिन कंटेनर टेम्पलेट को प्लेसहोल्डर द्वारा त्वरित किया गया है, अर्थात
 typedef A<int, std::vector>::type type; 
लिखने
 typedef A<int, std::vector<boost::mpl::_1> >::type type; 

वांछित प्रकार के साथ प्लेसहोल्डर द्वारा तत्काल कंटेनर को तत्काल भेजने के लिए, हम बढ़ावा देते हैं :: mpl :: लागू करें:
 #include <boost/mpl/apply.hpp> template <typename T, typename Container> struct A { typedef typename boost::mpl::apply<Container, T>::type type; }; 

वास्तविक प्रोग्रामिंग में इस ट्रिक का उपयोग करने से आपके कुछ भ्रमित पैटर्न को सरल बनाने में मदद मिलेगी।


Source: https://habr.com/ru/post/In191588/


All Articles