दिलचस्प पोस्ट
पारदर्शी इमेजबटन कैसे करें: एंड्रॉइड घंटों से 'एक्स' मात्रा जोड़ें जेपीईजी छवि को सी # बेस 64 स्ट्रिंग UimodalTransitionStylePartialCurl पिछले स्थिति में वापस नहीं मिलता है। (खारिज नहीं) मैं कैसे चेक कर सकता हूं कि क्या jquery के साथ क्लिक ईवेंट के दौरान दबाया जाता है? एंड्रॉइड में फ़ायरबेज डाटा डिस्क्स सॉर्टिंग चेन एकाधिक अलामोफर अनुरोध निकटतम 10 अंतराल के लिए गोल मान के लिए नेट एल्गोरिथ्म में निर्मित php localhost से मेल भेजें एकाधिक दृश्य प्रकार के साथ रीसाइक्लियर दृश्य कैसे बनाएं? लॉग बेस (2) सी / सी ++ में लिखने के लिए कैसे एक ही वर्ग की वस्तुओं को एक-दूसरे के निजी डेटा तक पहुंच क्यों है? Jquery UI संवाद में "पुष्टिकरण" संवाद को कैसे कार्यान्वित करें? स्विफ्ट 2.0 कैलेंडर घटक त्रुटि एक पृष्ठभूमि छवि के रूप में एक एसवीजी निर्दिष्ट करें और फिर भी सीएसएस में एसवीजी शैली?

गैर प्रकार के टेम्पलेट पैरामीटर

मैं समझता हूं कि गैर-प्रकार वाला टेम्प्लेट पैरामीटर एक स्थिर अभिन्न अभिव्यक्ति होना चाहिए। क्या कोई प्रकाश कर सकता है ऐसा क्यों है?

template <std::string temp> void foo() { // ... } 
 error C2993: 'std::string' : illegal type for non-type template parameter 'temp'. 

मैं समझता हूं कि एक निरंतर अभिन्न अभिव्यक्ति क्या है गैर-निरंतर प्रकारों जैसे std::string को ऊपर दिए गए स्निपेट के समान नहीं होने के कारण क्या हैं?

वेब के समाधान से एकत्रित समाधान "गैर प्रकार के टेम्पलेट पैरामीटर"

कारण आप ऐसा नहीं कर सकते क्योंकि गैर-निरंतर अभिव्यक्तियों का विश्लेषण नहीं किया जा सकता है और संकलन समय के दौरान प्रतिस्थापित किया जा सकता है। वे रनटाइम के दौरान बदल सकते हैं, जिसके लिए रनटाइम के दौरान एक नया टेम्प्लेट बनाने की आवश्यकता होगी, जो संभव नहीं है क्योंकि टेम्पलेट कंपाइल-टाइम अवधारणा हैं

मानक जो गैर-प्रकार के टेम्प्लेट पैरामीटर (14.1 [temp.param] p4) की अनुमति देता है:

एक गैर-प्रकार वाला टेम्प्लेट-पैरामीटर निम्न में से एक होगा (वैकल्पिक रूप से सीवी-योग्य) प्रकार:

  • अभिन्न या गणना प्रकार,
  • ऑब्जेक्ट या पॉइन्टर को फ़ंक्शन करने के लिए पॉइंटर,
  • कार्य करने के लिए ऑब्जेक्ट या लावलू संदर्भ के लिए लावल्यू संदर्भ,
  • सदस्य को सूचक,
  • std::nullptr_t

इसकी अनुमति नहीं है

हालांकि, यह अनुमति है:

 template <std::string * temp> //pointer to object void f(); template <std::string & temp> //reference to object void g(); 

§14.1 / 6,7,8 सी ++ मानक (2003) देखें।


उदाहरण:

 template <std::string * temp> //pointer to object void f() { cout << *temp << endl; } template <std::string & temp> //reference to object void g() { cout << temp << endl; temp += "...appended some string"; } std::string s; //must not be local as it must have external linkage! int main() { s = "can assign values locally"; f<&s>(); g<s>(); cout << s << endl; return 0; } 

आउटपुट:

 can assign values locally can assign values locally can assign values locally...appended some string 

आप टेम्पलेट तर्कों को उलझा कर सकते हैं

 template <std::string temp> void f() { // ... } f<"foo">(); f<"bar">(); // different function!? 

अब एक निहितार्थ को std::string लिए वर्णों की एक अनूठी अनुक्रम के साथ आने की जरूरत होगी, या उस बात के लिए, किसी भी अन्य मनमानी उपयोगकर्ता परिभाषित वर्ग, एक विशेष मूल्य को संचयित करेगा, जिसका अर्थ कार्यान्वयन के लिए ज्ञात नहीं है और इसके अलावा, समय-समय पर संक्रामक वर्ग वस्तुओं के मूल्य की गणना नहीं की जा सकती।

यह शाब्दिक वर्ग प्रकारों को टेम्पलेट पैरामीटर प्रकार के रूप में पोस्ट-सी ++ 0x के लिए अनुमति देने पर विचार करने की योजना बनाई गई है, जो निरंतर अभिव्यक्ति के द्वारा आरंभ किया जाता है। जिनके डेटा सदस्यों को उनके मूल्यों के आधार पर उलटा हुआ है (आधार कक्षाओं के लिए, उदाहरण के लिए हम गहराई से पहले, बाएं-से-दाएं ट्रैवर्टल लागू कर सकते हैं)। लेकिन यह निश्चित रूप से मनमाने वर्गों के लिए काम करने वाला नहीं है।

टेम्पलेट तर्क सूची में प्रदान किए गए एक गैर-प्रकार के टेम्प्लेट तर्क एक अभिव्यक्ति है, जिसका मान संकलन समय पर निर्धारित किया जा सकता है। ऐसे तर्क होना चाहिए:

निरंतर अभिव्यक्ति, बाहरी लिंकेज के साथ कार्य या वस्तुओं के पते, या स्थिर वर्ग सदस्यों के पते।

इसके अलावा, स्ट्रिंग लीटरल्स आंतरिक लिंकेज वाले ऑब्जेक्ट हैं, इसलिए आप उन्हें टेम्पलेट आर्ग्यूमेंट्स के रूप में उपयोग नहीं कर सकते। आप एक वैश्विक संकेतक का उपयोग नहीं कर सकते हैं, या तो फ़्लोटिंग-पॉइंट लीटरल की अनुमति नहीं है, गोल-ऑफ त्रुटियों की स्पष्ट संभावना को देखते हुए