दिलचस्प पोस्ट
लैम्ब्डा भावों की समानता का परीक्षण करने का सबसे कारगर तरीका AngularJS में पृथक गुंजाइश के बिना निर्देशक से एक नियंत्रक समारोह को कॉल करें मुझे OSV पर JAVA_HOME को क्या सेट करना चाहिए? JQuery कैसे href टैग से मूल्य निकालने के लिए? गुलप टास्क से फाइल / निर्देशिका को छोड़कर नोडजे में कॉलबैक नरक? MySQL के लिए पहले समकक्ष द्वारा कनेक्ट करें मावेन-जार से बचने का सबसे अच्छा तरीका क्या है? Google ऐप्स उपयोगकर्ता खाता डेटा वापस करने के लिए oauth के साथ bash curl का उपयोग करें? 2 कोणों के बीच का सबसे छोटा अंतर बेस्ट प्रैक्टिस: लूपिंग के बिना डॉक्यूटेक करने के लिए LINQ क्वेरी परिणाम परिवर्तित करें फायरबेज एंड्रॉइड: उपयोगकर्ता नाम अद्वितीय बनाएं स्ट्रिंग के पहले अक्षर को प्राप्त करना और निकालना आईआईएस 7.5 पर एएसपी.नेट एमवीसी CGImage से आरजीबी पिक्सेल डेटा प्राप्त करना

यह कैसे "सरणी का आकार" टेम्पलेट फ़ंक्शन कार्य करता है?

संभावित डुप्लिकेट:
क्या कोई इस टेम्पलेट कोड को समझा सकता है जो मुझे सरणी का आकार देता है?
फ़ंक्शन टेम्पलेट में जादू तर्क …

क्या कोई यह समझा सकता है कि यह कोड कैसे काम करता है? मुझे पता है कि इस कोड का उद्देश्य एक सरणी की लंबाई प्राप्त करना है, लेकिन मुझे नहीं पता कि यह कोड कैसे काम करता है:

template<typename T, int size> int GetArrLength(T(&)[size]){return size;} 

धन्यवाद।

Solutions Collecting From Web of "यह कैसे "सरणी का आकार" टेम्पलेट फ़ंक्शन कार्य करता है?"

पहले चलो पैरामीटर, T(&)[size] काटना। अंदरूनी, सही से बाएं, कोष्ठक समूह पहले से घोषणाएं पढ़ें: यह एक अनाम पैरामीटर है जो आकार के size के size के एक सरणी के लिए संदर्भ है।

यह है, यह किसी भी सरणी के संदर्भ को स्वीकार करता है, जहां सरणी के प्रकार और आकार टेम्प्लेट पैरामीटर हैं।

अगर हम इसे इस तरह कहते हैं:

 int a[10]; GetArrLength(a); 

कंपाइलर टेम्प्लेट पैरामीटर को निकालने का प्रयास करेगा। पैरामीटर प्रकार के लिए आप जो गुजर रहे हैं उससे मिलान करने के लिए, T को int होना चाहिए और size 10 होना चाहिए (पैरामीटर को 10 int की एक सरणी के संदर्भ में बनाना)।

फिर आप उस आकार को लौटा सकते हैं, आपको एक सरणी में तत्वों की संख्या दे सकते हैं।


इस कोड के साथ दो "समस्याएं" हैं सबसे पहले, आकार नकारात्मक नहीं हो सकते हैं, इसलिए यह टेम्पलेट पैरामीटर और रिटर्न प्रकार के रूप में एक हस्ताक्षरित प्रकार का उपयोग करने का अर्थ नहीं है। इसके बजाय, एक अहस्ताक्षरित प्रकार का उपयोग किया जाना चाहिए; सबसे अच्छा होगा std::size_t :

 template<typename T, std::size_t Size> std::size_t GetArrLength(T(&)[Size]) { return size; } 

दूसरा यह है कि इस फ़ंक्शन का परिणाम निरंतर अभिव्यक्ति नहीं है, भले ही एक सरणी का आकार है हालाँकि अधिकांश स्थितियों में यह ठीक है, यह बेहतर होगा यदि हम इसे निरंतर अभिव्यक्ति प्राप्त कर सकें। यही वह जगह है जहाँ आप इस समाधान के साथ समाप्त होते हैं:

 template <std::size_t N> struct type_of_size { typedef char type[N]; }; template <typename T, std::size_t Size> typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]); #define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray)) 

इसका प्रयोग इस प्रकार है:

 int a[10]; const std::size_t n = sizeof_array(a); // constant-expression! 

यह तीन चीजों द्वारा काम करता है: पहले से ऊपर विचार एक ही विचार है, उस टेम्पलेट पैरामीटर को आप के आकार को भर दिया जाएगा।

दूसरा भाग एक विशिष्ट आकार के साथ एक प्रकार बनाने के लिए उस जानकारी का उपयोग कर रहा है, इसलिए type_of_size सहायक वह भाग कड़ाई से जरूरी नहीं है, लेकिन मुझे लगता है कि यह कोड को पढ़ने में आसान बनाता है। एक char[N] का आकार N बराबर है, हमेशा, इसलिए हम उस प्रकार के आकार के आकार में "सर" के आकार को "स्टोर" करने का दुरुपयोग कर सकते हैं!

तीसरा भाग आकार के आकार के साथ मिल रहा है यह वास्तव में कुछ भी मूल्यांकन नहीं करता है, इसलिए फ़ंक्शन के लिए हमें एक परिभाषा की आवश्यकता नहीं है। यह केवल कहते हैं, "यदि आप ऐसा करने वाले थे … आकार होगा …" और हमारे "संग्रहीत" आकार का आकार, char सरणी में है