2016-01-28 6 views
9

कई साल पहले, (कम से कम मेरे लिए) स्थिर सी ++ बहुरूपता सुसंगत लगती थी। इस तरह अजगर के रूप में बोली duck typing पर भरोसा किया है, जहां आप हैं:क्यों सी ++ 1 * फिर भी पूर्ण बतख टाइपिंग के लियू में टेम्पलेट कीवर्ड की आवश्यकता है

def fn(foo, bar): 
    foo.baz(bar.bo()) 

और विचार है कि अगर यह "quacked" उचित रूप से, यह भाषा से ठीक था।

सी ++ में, इसके विपरीत, आप को समझाने के लिए क्या "जानवर" यह था होगा:

void fn(foo_type foo, bar_type bar); 

और "परिवारों के राज्यों के लिए", आप स्पष्ट रूप से template कीवर्ड का उपयोग पूरे करने होंगे:

template<class Foo, class Bar> 
void fn(Foo foo, Bar bar); 

auto ...() -> decltype वापसी प्रकार है, लेकिन विशेष रूप से generic lambdas की तरह नई सुविधाओं के साथ, वहाँ और अधिक की तरह कुछ हो गया लगता है गैर टेम्पलेट अजगर की तरह डु सी.के. टाइपिंग:

[] (auto container) { return container.size(); }; 

मेरा प्रश्न है, तो, है क्यों template कीवर्ड है अभी भी जरूरत है? क्यों न सिर्फ पूरी तरह से (वैकल्पिक) बतख टाइपिंग आलिंगन:

// Takes a foo_type and a bar_type 
void fn(foo_type foo, bar_type bar); 

// Takes some "foo-quacking" type, and a bar_type 
void fn(auto foo, bar_type bar); 

// Etc. 
+5

आप सी ++ 1Z/C++ 2x के लिए अवधारणाओं प्रस्तावों की जांच की है? – Yakk

+0

@ यक, धन्यवाद - मैंने अवधारणाओं पर ध्यान नहीं दिया। पढ़ा जाएगा। –

+3

यह आ रहा है, लेकिन सब कुछ एक साथ नहीं होता है। सी ++ 11 में हमने लैम्बडास के लिए वापसी प्रकारों को घटा दिया, फिर सी ++ 14 में हमने उन्हें सभी कार्यों के लिए प्राप्त किया। सी ++ 14 में हमें जेनेरिक लैम्बडास (यानी 'ऑटो' पैरामीटर मिलते हैं) और अवधारणाएं टीएस सामान्य कार्यों के लिए समान जोड़ती हैं (ऐसा फ़ंक्शन निहित रूप से फ़ंक्शन टेम्पलेट बन जाता है और आपूर्ति किए गए तर्कों के लिए तत्काल हो जाता है)। –

उत्तर

10

यह Concepts सुविधा का हिस्सा के रूप में लगभग दरवाजे पर वास्तव में है, और कुछ compilers पहले से ही इसे लागू! उदाहरण के लिए, जीसीसी 4.9 के साथ, अगर आप -std=c++1y निर्दिष्ट करते हैं, तो आप वास्तव में संकलन और निम्नलिखित चला सकते हैं:

auto print_arg(auto arg) { 
    std::cout << arg; 
} 
+0

धन्यवाद! उस बारे में बिल्कुल पता नहीं था। –

+1

और इसके बाद हम 'ऑटो' कीवर्ड से छुटकारा पायेंगे :) – Pierre

+2

@Pierre कुछ बार चर्चा भी हुई है, पिछली बार मैंने चेक-आधारित सरलीकृत करने के लिए, केवल 'v (V: V)' के लिए, जो कि होगा संभवतः '(ऑटो और वी वी: वी)' के बराबर हो। –

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