टेम्पलेट कटौती गाइड क्या हैं और हमें उनका उपयोग कब करना चाहिए?


87

C ++ 17 मानक "टेम्पलेट कटौती गाइड" का परिचय देता है। मुझे लगता है कि वे मानक के इस संस्करण में पेश किए गए निर्माणकर्ताओं के लिए नए टेम्पलेट तर्क कटौती के साथ कुछ करने के लिए इकट्ठा हुए हैं, लेकिन मैंने अभी तक एक साधारण, सामान्य प्रश्न-शैली का स्पष्टीकरण नहीं देखा है कि वे क्या हैं और वे किस लिए हैं।

  • C ++ 17 में टेम्पलेट कटौती गाइड क्या हैं?

  • क्यों और कब) हमें उनकी आवश्यकता है?

  • मैं उन्हें कैसे घोषित करूं?



विशेष रूप से, मुझे यह जानने में दिलचस्पी होगी कि क्या कोई कटौती गाइड वास्तव में C ++ 17 STL (जैसे std :: pair या std :: tuple) द्वारा प्रदान किया गया है। C ++ 17 के अनुसार "deducible" मानक टेम्पलेट प्रकारों की पूरी सूची क्या है?
क्क्सप्लसटोन


मुझे यह जानने में दिलचस्पी होगी कि क्या कोई कंपाइलर इसका समर्थन करता है। मैंने जीसीसी, क्लैंग और वीसी ++ की कोशिश की। rextester.com/DHPHC32332 कोई बात नहीं, मैंने पाया यह जीसी साथ ++ 8.1 सी ++ 17 और 2 ए जी ++ -std = c ++ 17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out ही काम करता है
जीन साइमन Brochu

जवाबों:


98

टेम्प्लेट डिडक्शन गाइड एक टेम्प्लेट क्लास से जुड़े पैटर्न होते हैं जो कंपाइलर को क्लास के लिए कंस्ट्रक्टर तर्कों (और उनके प्रकारों) के एक सेट को ट्रांसलेट पैरामीटर में अनुवाद करने का तरीका बताते हैं।

इसका सबसे सरल उदाहरण std::vectorइसका निर्माणकर्ता है जो पुनरावृति जोड़ी लेता है।

template<typename Iterator>
void func(Iterator first, Iterator last)
{
  vector v(first, last);
}

संकलक यह पता लगाने की क्या जरूरत vector<T>के Tप्रकार किया जाएगा। हम जानते हैं कि उत्तर क्या है; Tहोना चाहिए typename std::iterator_traits<Iterator>::value_type। लेकिन हम संकलक को टाइप किए बिना कैसे बताएंगे vector<typename std::iterator_traits<Iterator>::value_type>?

आप एक कटौती गाइड का उपयोग करते हैं:

template<typename Iterator> vector(Iterator b, Iterator e) -> 
    vector<typename std::iterator_traits<Iterator>::value_type>;

यह संकलक को बताता है कि, जब आप vectorउस पैटर्न से मेल खाते एक निर्माता को बुलाते हैं , तो यह vectorदाईं ओर कोड का उपयोग करके विशेषज्ञता को घटा देगा ->

आपको उन दिशानिर्देशों की आवश्यकता होती है जब तर्कों से प्रकार की कटौती उन तर्कों में से एक के प्रकार पर आधारित नहीं होती है। एक आरंभ किया जा रहा vectorएक से initializer_listस्पष्ट रूप से उपयोग करता vectorहै Tतो यह एक गाइड की जरूरत नहीं है,।

बाईं ओर आवश्यक रूप से एक वास्तविक निर्माता निर्दिष्ट नहीं करता है। जिस तरह से यह काम करता है, यदि आप एक प्रकार पर टेम्पलेट निर्माण कटौती का उपयोग करते हैं, तो यह उन तर्कों से मेल खाता है जो आप सभी कटौती गाइड के खिलाफ पास करते हैं (प्राथमिक टेम्पलेट के वास्तविक निर्माता अंतर्निहित गाइड प्रदान करते हैं)। यदि कोई मेल है, तो इसका उपयोग यह निर्धारित करने के लिए करता है कि किस प्रकार को प्रदान करने के लिए कौन से टेम्पलेट तर्क हैं।

लेकिन एक बार यह कटौती की जाती है, एक बार संकलक प्रकार के लिए टेम्पलेट मापदंडों का पता लगाता है, उस प्रकार की वस्तु के लिए इनिशियलाइज़ेशन ऐसा होता है जैसे कि कोई भी नहीं हुआ। यही है, चयनित कटौती गाइड को चयनित निर्माता से मेल नहीं खाता है ।

इसका अर्थ यह भी है कि आप समुच्चय और कुल आरंभ के साथ गाइड का उपयोग कर सकते हैं:

template<typename T>
struct Thingy
{
  T t;
};

Thingy(const char *) -> Thingy<std::string>;

Thingy thing{"A String"}; //thing.t is a `std::string`.

इसलिए कटौती गाइडों का उपयोग केवल इस प्रकार का पता लगाने के लिए किया जाता है। आरंभीकरण की वास्तविक प्रक्रिया ठीक उसी तरह काम करती है जैसी पहले की थी, एक बार जो दृढ़ संकल्प कर ली गई है।


7
हम्म, यह सिर्फ मेरे साथ हुआ है कि गाइड के साथ भी vector v{first, last};सही काम नहीं करेंगे :(
TC

3
@ टीटी ... जब तक कि सही चीज पुनरावृत्तियों का वेक्टर नहीं बना रही है। और std::string{32,'*'}[0] == ' '(ASCII के लिए)। लेकिन C ++ 11 के बाद से यह सब सच है।
अर्ने वोगेल

2
आवंटन वेक्टर वेक्टर के साथ क्या होता है? यदि आबंटित वेक्टर पैरामीटर में डिफ़ॉल्ट तर्क नहीं होगा तो क्या होगा? (आप InputIterator से इसे कम नहीं कर सकते हैं)
gnzlbg

@ एनकोलबोल: क्या आप इस बात का विवरण बताएंगे कि आंशिक और पूरी तरह से विशिष्ट वर्गों (जिनके निर्माणकर्ताओं को स्पष्ट रूप से प्राथमिक टेम्पलेट से मेल खाने वाले पैरामीटर प्रकार की आवश्यकता नहीं है) के संदर्भ में निहित और स्पष्ट कटौती गाइड कैसे काम कर सकते हैं? त्वरित खोज के माध्यम से इस पर जानकारी प्राप्त करना कठिन है।
user541686

1
@ निचलोलस: मैं देख रहा हूं। यह मेरे लिए स्पष्ट नहीं है कि सवाल स्पष्ट कटौती गाइडों के बारे में है ... मुझे लगता है कि यह उपयोगी है यदि आप सिर्फ वही लिखते हैं जो आपने इस टिप्पणी में लिखा है।
user541686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.