c++ - Counting the total number of types in a nested pack -
न्यूमैट टाइप & lt; एआरजी ... & gt; :: value में Args ... , नेस्टेड पैक में सभी प्रकार (यदि कोई हो), जैसे यदि
का उपयोग कर टी = समूह के & lt; पूर्णांक, bool, लपेटें & LT; चार, पैक करें & lt; चार, लंबे, समूह के & lt; चार, वस्तु, लघु & gt ;, कम & gt ;, डबल & gt ;, लंबे & gt ;; तब न्यूमैटिप्पस & lt; T, int, char & gt; :: value 13 हो जाएगा (हम रैपर वर्गों की गणना नहीं करते हैं)। निम्न कोड सही तरीके से काम करता है, लेकिन जब मैं std :: string के साथ किसी भी प्रकार को प्रतिस्थापित करता / करती हूं, मुझे std :: allocator त्रुटियों की घबराहट मिलती है जो कभी भी समाप्त नहीं होती (जीसीसी 4.8 .1)। मुझे संदेह है कि अन्य प्रकार से एक ही त्रुटि उत्पन्न होगी। क्यूं कर? और यह अजीब त्रुटि से बचने के लिए कोड को कैसे ठीक करें?
#include & lt; iostream & gt; #include & lt; स्ट्रिंग & gt; # परिभाषित शो (चर) std :: cout & lt; & lt; # वैरिएबल & lt; & lt; "=" & Lt; & lt; चर & lt; & lt; std :: endl; टेम्पलेट & lt; typename T & gt; Struct आईपैक {स्थिर कॉन्स्ट बूल मूल्य = गलत; }; टेम्पलेट & lt; टेम्पलेट & lt; typename ... & gt; क्लास पी, टाइपनाम ... Args & gt; संरचना आईपैक & lt; पी एंड एलटी; आरजीएस ... & gt; & gt; {स्थिर कॉन्स्ट बूल मूल्य = सच; }; टेम्पलेट & lt; typename ... & gt; संरचना आकार प्रकार; टेम्पलेट & lt; typename T & gt; स्टंट न्यूमैटिप्स & lt; T & gt; {स्थैतिक const int int = 1; }; टेम्पलेट & lt; टेम्पलेट & lt; typename ... & gt; कक्षा पी & gt; स्ट्रेट न्यूम टाइप & lt; पी & lt; & gt; & gt; {स्थैतिक const int int = 0; }; टेम्पलेट & lt; टेम्पलेट & lt; typename ... & gt; क्लास पी, टाइपनाम प्रथम, टाइपनाम ... रेस्ट & gt; स्ट्रेट न्यूम टाइप & लेफ्टिनेंट; पी एंड एलटी; फर्स्ट, रेस्ट ... & gt; & gt; {स्थिर const int value = IsPack & lt; प्रथम & gt; :: मान? NumTypes & LT; पहले & gt; :: मूल्य + NumTypes & lt; p & LT; रेस्ट ... & gt; & gt; :: मूल्य: 1 + NumTypes & lt; p & LT; रेस्ट ... & gt; & gt; :: मूल्य; }; टेम्पलेट & lt; typename प्रथम, typename ... Rest & gt; स्ट्रेट न्यूमैट टाइप & lt; फर्स्ट, रेस्ट ... & gt; {स्थिर const int value = NumTypes & lt; प्रथम & gt ;: मान + NumTypes & lt; Rest ... & gt; :: मूल्य; }; टेम्पलेट & lt; typename ... & gt; संरचना पैक; टेम्पलेट & lt; typename ... & gt; संरचना समूह; टेम्पलेट & lt; typename ... & gt; संरचना लपेटें; संरचना वस्तु {}; Int main () {ए = पैक & lt; int, Object, long & gt ;; शो (NumTypes & lt; A & gt; :: मान) // 3 का उपयोग करके B = पैक & lt; int, bool, पैक & lt; char, ऑब्जेक्ट & gt ;, long & gt ;; शो (NumTypes & lt; p & gt; :: मूल्य) // 5 सी = समूह के & lt उपयोग करते हुए; पूर्णांक, bool, लपेटें & LT; चार, पैक करें & lt; चार, लंबे, समूह के & lt; चार, वस्तु, लघु & gt ;, कम & gt ;, डबल & gt ;, लंबे & gt ;; शो (NumTypes & LT; सी & gt; :: मूल्य) // 11 डी = समूह के & lt उपयोग करते हुए; पैक करें & lt; पूर्णांक, वस्तु, डबल & gt ;, bool, लपेटें & LT; चार, पैक करें & lt; चार, डबल, समूह के & lt; चार, पैक करें & lt; चार, लंबे, लघु & gt ;, इंट, ऑब्जेक्ट & gt;, लघु & gt ;, डबल & gt;, लंबे & gt ;; शो (NumTypes & lt; डी & gt; :: मान) // 16 std :: cout & lt; & lt; न्यूट प्रकार & lt; ए, बी, इंट, चार, सी, ऑब्जेक्ट, डी & gt; :: मान & lt; & lt; std :: endl; // 38}
std :: स्ट्रिंग में है तथ्य यह है std :: basic_string & LT; चार, char_traits & LT; चार & gt ;, संभाजक & LT; चार्ट & gt; & gt;
और इसकी घोषणा डिफ़ॉल्ट टेम्पलेट तर्क है:।
टेम्पलेट के & lt ; वर्ग चार्ट, वर्ग के लक्षण = चार_ट्रेट्स & lt; चारट & gt ;, क्लास आलोक = ऑलोकेटर & lt; charT & gt; & gt; कक्षा बुनियादी_स्ट्रिंग; आपके प्रत्यावर्तन तो गलत है, और तुम अनंत लूप है (जब आप basic_string करें & lt से पहले पैरामीटर निकालना; चार्ट, लक्षण, alloc & gt; , आप मिल गया <कोड > मूल_स्ट्रिंग & लेफ्टिनेंट; विशेषताएँ, आलोक, आवर्तक & lt; लक्षण & gt; & gt; )।
आप समीकरण से पी को निकालकर ठीक कर सकते हैं:
टेम्पलेट & lt; टेम्पलेट & lt; typename ... & gt; क्लास पी, टाइपनाम प्रथम, टाइपनाम ... रेस्ट & gt; स्ट्रेट न्यूम टाइप & लेफ्टिनेंट; पी एंड एलटी; फर्स्ट, रेस्ट ... & gt; & gt; {स्थैतिक const int numInFirst = NumTypes & lt; प्रथम & gt; :: मान; स्थिर const int मान = numInFirst + NumTypes & lt; std :: tuple & lt; बाकी ... & gt; & gt; :: मूल्य; };
Comments
Post a Comment