टेम्पलेट डिफ़ॉल्ट तर्क


151

अगर मुझे निम्नलिखित करने की अनुमति है:

template <typename T = int>
class Foo{
};

मुझे मुख्य में निम्नलिखित करने की अनुमति क्यों नहीं है?

Foo me;

लेकिन मुझे निम्नलिखित बताना होगा:

Foo<int> me;

C ++ 11 ने डिफ़ॉल्ट टेम्पलेट तर्क प्रस्तुत किए और अभी वे मेरी पूरी समझ के लिए मायावी हैं।

जवाबों:


188

आप को करना पड़ेगा:

Foo<> me;

टेम्पलेट के तर्क मौजूद होने चाहिए लेकिन आप उन्हें खाली छोड़ सकते हैं।

fooएक एकल डिफ़ॉल्ट तर्क के साथ एक फ़ंक्शन की तरह सोचें । अभिव्यक्ति fooइसे नहीं कहेगी, लेकिन foo()करेगी। तर्क सिंटैक्स अभी भी होना चाहिए। यह उसी के अनुरूप है।


4
@Pubby मैं इसे कुछ अनावश्यक जटिलताओं बनाने होता अगर मान लें कि Foo हो सकता है एक टेम्पलेट पहचानकर्ता है या हो सकता है एक स्पष्ट इन्स्टेन्शियशन कि क्या वहाँ एक डिफ़ॉल्ट तर्क है पर निर्भर करता है। बेहतर स्पष्ट तात्कालिकता वाक्यविन्यास रखें। fooएक डिफ़ॉल्ट पैरामीटर के साथ एक फ़ंक्शन की तरह सोचें । आप इसे पसंद नहीं कर सकते foo, आप इसे कहते हैं foo()। यह लगातार इसे बनाए रखने के लिए समझ में आता है।
जोसफ मैन्सफील्ड

2
@sftrabbit लेकिन आप fooकिसी भी तरह के तर्कों के साथ एक फ़ंक्शन नहीं कह सकते ; आप किसी भी तर्क के साथ एक वर्ग का नाम रख सकते हैं Foo
सेठ कार्नेगी

4
@aschepler फ़ंक्शन के साथ, टेम्पलेट तर्क फ़ंक्शन फ़ंक्शन से काटे जा सकते हैं। एक वर्ग के साथ, यह तय करना संभव नहीं है, कि आपका मतलब डिफ़ॉल्ट तर्कों के साथ टेम्पलेट वर्ग है या गैर-टेम्पलेट वर्ग है।
ओलाफ डायटशे


7
@Pubby मानक समिति ने खुद से वही पूछा, मुझे लगता है। अब, C ++ 17 के साथ, <>इस मामले में अधिक आवश्यक नहीं है। अधिक विवरण के लिए मेरा उत्तर देखें।
पाओलो एम

53

C ++ 17 के साथ, आप वास्तव में कर सकते हैं।

इस सुविधा को क्लास टेम्पलेट तर्क कटौती कहा जाता है और जिस तरह से आप टेम्प्लेटेड प्रकारों के चर घोषित कर सकते हैं, उसमें अधिक लचीलापन जोड़ सकते हैं

इसलिए,

template <typename T = int>
class Foo{};

int main() {
    Foo f;
}

अब कानूनी C ++ कोड है


5
अजीब। बस मेरी C ++ 17 परियोजना में यह कोशिश की और यह काम नहीं किया: "टेम्पलेट प्लेसहोल्डर प्रकार 'कास्ट MyType' को एक सरल घोषणाकर्ता-आईडी द्वारा पालन किया जाना चाहिए"। मैं जीसीसी 7.3.0 का उपयोग कर रहा हूं।
सिलिकामंचर

1
@Silicomancer यह आपके कोड और कमांड लाइन को देखे बिना कहना मुश्किल है ... हो सकता है कि आप यहाँ की तरह संकेत दे रहे हों ?
पाओलो M

1
Clang यह स्वीकार नहीं करता है? coliru.stacked-crooked.com/a/c5d3c0f90ed263c2
Borgleader

1
@Borgleader जाहिर है, Coliru क्लेंग 5.0 का उपयोग कर रहा है। द्वारा पहचानने यह है, यह सी ++ 17 टेम्पलेट तर्क कटौती का समर्थन करना चाहिए, लेकिन जाहिर आईडी नहीं करता है। यदि आप क्लैंग 7.0 का उपयोग करते हुए वैंडबॉक्स में अपने बहुत ही उदाहरण का प्रयास करते हैं, तो यह त्रुटिपूर्ण रूप से काम करता है।
पाओलो एम

2
@PaoloM ओह कूल, इसकी सिर्फ एक संकलक संस्करण समस्या को जानकर खुशी हुई। इस मामले की तलाश के लिए धन्यवाद।
बोर्गलर

19

आपको ऐसा करने की अनुमति नहीं है लेकिन आप ऐसा कर सकते हैं

typedef Foo<> Fooo;

और फिर करते हैं

Fooo me;

क्या डिफ़ॉल्ट प्रकार के साथ इसमें कोई अंतर है और:, typedef Foo<float> Fooo;डिफ़ॉल्ट प्रकार के बिना?
qrikko

5
सी ++ 11-ईश मार्ग कहने के लिए होगाusing Fooo = Foo<>;
एड्रियन डब्ल्यू

18

आप निम्नलिखित का उपयोग कर सकते हैं:

Foo<> me;

और intआपके टेम्पलेट तर्क हैं। कोणीय कोष्ठक आवश्यक हैं और छोड़ा नहीं जा सकता है।


समझ में आता है और आपको धन्यवाद देता है, लेकिन जैसा कि नीचे उल्लेख किया गया है, ओटी में टाइप क्यों मौजूद है?
user633658

@ user633658: क्या आपका मतलब "टाइप स्पेसियर" है? मुझे यकीन नहीं है कि मैं समझता हूं
एंडी प्रोल

वैसे भी, खाली कोणीय कोष्ठक की आवश्यकता के पीछे के कारण के बारे में, मैं केवल अनुमान लगा सकता हूं, और वे सभी अकेले टेम्पलेट के नाम के उपयोग के साथ संभावित अस्पष्टताओं को खारिज करने के बारे में हैं, लेकिन मुझे यह स्वीकार करना होगा कि मुझे सटीक नहीं पता है कारण
एंडी प्रोल

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