गैर प्रकार टेम्प्लेट पैरामीटर जाहिर है जो कि प्रकार नहीं हैं उदाहरण के लिए, कर रहे हैं:संरचना को टेम्पलेट गैर-प्रकार पैरामीटर के रूप में मान के रूप में क्यों नहीं पारित किया जा सकता है?
template<int x>
void foo() { cout << x; }
उस मामले में int
के अलावा अन्य विकल्प होते हैं, और मैं this great answer का उल्लेख करना चाहते हैं।
अब, एक चीज है जो मुझे बग करता है: structs। पर विचार करें:
struct Triple { int x, y, z; };
Triple t { 1, 2, 3 };
template<Triple const& t>
class Foo { };
अब, सामान्य nontype संदर्भ अर्थ विज्ञान का उपयोग कर, हम लिख सकते हैं:
Foo<t> f;
क्या यहाँ ध्यान देने योग्य है कि t
नहीं हो सकता है constexpr
या यहाँ तक कि const
, क्योंकि वह आंतरिक का तात्पर्य है लिंकेज, जिसका मूल रूप से मतलब है कि रेखा संकलित नहीं होगी। हम t
को const extern
के रूप में घोषित करके इसे बाईपास कर सकते हैं। अपने आप में एक सा अजीब हो सकता है यही कारण है, लेकिन एक है कि वास्तव में बनाया मुझे था क्यों यह संभव नहीं है:
Foo<Triple { 1, 2, 3 }> f;
हम संकलक से एक बहुत सभ्य त्रुटि मिलती है:
error:
Triple{1, 2, 3}
is not a valid template argument for typeconst Triple&
because it is not an lvalue.
हम कर सकते हैं ' मान द्वारा टेम्पलेट में Triple
निर्दिष्ट करें, क्योंकि यह अस्वीकृत है। हालांकि, मैं कोड की उस छोटी सी रेखा के साथ वास्तविक समस्या को समझने में विफल रहा हूं। मूल्य पैरामीटर के रूप में structs का उपयोग करने की अनुमति न देने के पीछे तर्क क्या है। अगर मैं तीन int
एस का उपयोग कर सकता हूं, तो तीन चींटियों की संरचना क्यों नहीं? यदि इसमें केवल छोटे विशेष सदस्य हैं, तो यह केवल तीन चरों की तुलना में संभालने में वास्तव में अलग नहीं होना चाहिए।
मानक केवल int की अनुमति देता है, और सदस्य पॉइंटर्स मुझे लगता है। आप गैर-प्रकार के पैरामीटर के रूप में भी डबल या फ्लोट नहीं कर सकते हैं। या यहां तक कि कॉन्स चार * जो सभी उपयोगी रहे हैं (और आश्चर्यजनक रूप से वीसी 6 पर काम किया)। निश्चित नहीं है कि सी ++ 11 के लिए कुछ भी बदले गए हैं, वास्तव में कुछ उत्तरों द्वारा निर्णय लेते हैं। – Pete
@Pete 'const char * * में अलग-अलग स्थानों में लिखे गए समान अक्षरों के बीच असमानता की समस्या है, वही डबल/फ्लोट के लिए रहता है। इसके अलावा, आप संदर्भ छोड़ दिया। मेरा सवाल यह नहीं था कि यह संभव है (स्पष्ट रूप से नहीं), बल्कि यह * क्यों नहीं है *। –
मुझे लगता है कि मानक के लिए कुछ भी कम करने के लिए संभावित रूप से कई संभावनाएं थीं। यह निर्दिष्ट करने के लिए एक बहुत ही आसान बात है कि यह केवल int के लिए सीमित है या नहीं। शायद यह 50 वर्षों के समय में अगले सी ++ मानक में उपलब्ध होगा। – Pete