अंत में विभाजन एक गैर-सरणी तर्क (उदा। पॉइंटर) का पता लगाने पर प्रयास लगता है।
यह उदाहरण के लिए, char*
का पता लगाने में विफल रहता है, लेकिन T*
के लिए काम करेगा जहां sizeof(T)
पॉइंटर के आकार से अधिक है।
typedef ptrdiff_t Size;
template< class Type, Size n >
Size countOf(Type (&)[n]) { return n; }
इस समारोह टेम्पलेट सूचक तर्क, केवल सरणी के साथ instantiated नहीं किया जा सकता है:
सी ++ में, एक आम तौर पर निम्नलिखित समारोह टेम्पलेट पसंद करती हैं। सी ++ 11 में इसे वैकल्पिक रूप से std::begin
और std::end
के संदर्भ में व्यक्त किया जा सकता है, जो स्वचालित रूप से इसे यादृच्छिक एक्सेस इटरेटर्स के साथ मानक कंटेनर के लिए भी काम करने देता है।
सीमाएं: C++ 03 में स्थानीय प्रकार की सरणी के लिए काम नहीं करती है, और संकलन समय आकार उत्पन्न नहीं करती है। सभी कोड संकलक के हाथों से अछूता:
संकलन समय आकार के लिए आप के बजाय तरह
template< Size n > struct Sizer { char elems[n]; };
template< class Type, size n >
Sizer<n> countOf_(Type (&)[n]);
#define COUNT_OF(a) sizeof(countOf_(a).elems)
अस्वीकरण कर सकते हैं।
लेकिन सामान्य रूप से, केवल पहले फ़ंक्शन टेम्पलेट का उपयोग करें, countOf
।
चीयर्स & एचएचटी।
स्रोत
2010-10-31 17:37:00
इस पूरी बात है? के लिए '# endif' क्या है? –