2017-02-05 7 views
5

क्या कोई मुझे बता सकता है कि C++ 17 का std::get<T> क्यों वैश्विक कार्य है और variant<...> का सदस्य-कार्य नहीं है?`variant` वैश्विक कार्य के लिए std :: <T> क्यों प्राप्त करें?

+9

मैं पूरक प्रश्न पूछूंगा: यह सदस्य कार्य क्यों होना चाहिए? –

+7

[टुपल के समान] [https://stackoverflow.com/questions/3313479/stdtuple-get-member- कार्यक्षमता) निश्चित रूप से। वाक्यविन्यास बहुत बदसूरत हो जाता है। –

उत्तर

6

यदि get<T>() सदस्य फ़ंक्शन टेम्पलेट थे, तो template कीवर्ड वौडल की आवश्यकता होती है जब इसे एक निर्भर संदर्भ में बुलाया जाता है। उदाहरण के लिए:

template <typename Variant> 
void f(Variant const& v) { 
    auto x0 = v.template get<T>(); // if it were a member 
    auto x1 = get<T>(v);   // using a non-member function 
} 

यहां तक ​​कि एक using घोषणा या निर्देश get() अगर std::variant<...> और get() दोनों के रूप में पाया बिना नाम स्थान std घोषित किये गए हैं। इस प्रकार, ऐसा लगता है कि वैश्विक कार्य को उपयोग करना आसान है क्योंकि इसे सदस्य कार्य करने का कोई अच्छा कारण नहीं है।

+1

ठीक है, आपको (v) 'के लिए सही ढंग से पार्स करने के लिए' get' नामक फ़ंक्शन टेम्पलेट की आवश्यकता है। फिर भी, हर मोड़ पर 'टेम्पलेट' लिखने से बेहतर। –

+0

@ टी.सी. .: अच्छा बिंदु - टेम्पलेट पैरामीटर के साथ यह सीधे एडीएल के माध्यम से नहीं मिलता है। यह वैश्विक दायरे में घोषित किए जाने वाले एक अनावश्यक फ़ंक्शन टेम्पलेट के लिए बहस कर सकता है (उदा।, 'टेम्पलेट टाइपनाम टी :: अनावश्यक();'; तर्कों की संख्या वास्तव में कोई फर्क नहीं पड़ता ...)। –

संबंधित मुद्दे