2010-09-02 16 views
11

मैं बस सोच रहा था कि पैरामीटर पैक में पैरामीटर की संख्या गिनने के लिए सी ++ 0x std lib में कुछ भी उपलब्ध है या नहीं? मैं नीचे दिए गए कोड में field_count से छुटकारा पाना चाहता हूं। मुझे पता है कि मैं अपना खुद का काउंटर बना सकता हूं, लेकिन ऐसा लगता है कि यह C++ 0x std lib में शामिल करने के लिए एक स्पष्ट बात होगी, और मैं यह सुनिश्चित करना चाहता था कि यह पहले से नहीं था :) घर से उगाए गए काउंटर कार्यान्वयन भी सबसे स्वागत है।पैरामीटर पैक में पैरामीटर की गणना? क्या इसके लिए कोई सी ++ 0x std lib फ़ंक्शन है?

template<const int field_count, typename... Args> struct Entity { 
    const tuple<Args...> data; 
    const array<const char*, field_count> source_names; 

    Entity() : data() { 
    } 
}; 
+1

की डुप्लीकेट [? एक पैरामीटर पैक की लंबाई को खोजने के लिए कैसे] (http://stackoverflow.com/questions/2770474/ कैसे-से-लम्बाई-ऑफ-पैरामीटर-पैक) मुझे पता था कि मैंने यहां जवाब से 'आकार ...' के बारे में सीखा है ... –

+0

मैं वास्तव में इस प्रश्न को पोस्ट करने से पहले इसे पढ़ता हूं, लेकिन आधारित कर्सर पढ़ने पर मैंने किया, मुझे यकीन नहीं था कि वे सभी मानकों के कुल आकार बनाम पैरामीटर की वास्तविक संख्या में हो रहे थे। लॉल, मुझे अपने प्रश्न को बेहतर पसंद है, यह मेरे लिए स्पष्ट है :) –

उत्तर

27

हां, आप sizeof... का उपयोग कर सकते हैं। सी ++ 0x एफसीडी (§5.3.3/5) से:

sizeof... अभिव्यक्ति में पहचान पैरामीटर पैक का नाम देगी। sizeof... ऑपरेटर पैरामीटर पैक पहचानकर्ता के लिए प्रदान किए गए तर्कों की संख्या उत्पन्न करता है। sizeof... ऑपरेटर द्वारा पैरामीटर पैक का विस्तार किया गया है (14.5.3)। [उदाहरण:

template<class... Types> 
struct count { 
    static const std::size_t value = sizeof...(Types); 
}; 

- अंत उदाहरण]

+0

मुझे इस तरह के आकार का उपयोग करने में सक्षम होना पसंद है, लेकिन अब मैं उत्सुक/सतर्क हूं। आम तौर पर मैं बाइट्स की संख्या वापस करने के आकार की अपेक्षा करता हूं, लेकिन यहां यह मेरे लिए तर्कों को अनपैक और मायने रखता है। एक सरणी के साथ, सामान्य आकार मुझे सरणी के बाइट्स में आकार देने जा रहा है। क्या कोई "गॉथचास" लोगों को आकार का उपयोग करने के लिए बाहर देखने की ज़रूरत है ...? मैं इस बिंदु पर देखने के लिए पर्याप्त डब्ल्यू/सी ++ विशेषज्ञ नहीं हूं, लेकिन बाइट्स में अपना वास्तविक आकार प्राप्त करने के बजाय चीजों को गिनने के लिए आकार का उपयोग करने के बारे में मुझे थोड़ा सा कुछ है। क्या मैं सिर्फ semantically पागल हो रहा हूँ? जबरदस्त हंसी। –

+0

@pheadbaq: आप पैरामीटर पैक पर केवल 'sizeof ...' का उपयोग कर सकते हैं और यह हमेशा पैक में तर्कों की संख्या देता है। मुझे नहीं लगता कि इसके उपयोग में त्रुटि के लिए बहुत जगह है, लेकिन मुझे लगता है कि आपका क्या मतलब है। व्यक्तिगत रूप से, मुझे लगता है कि 'आकार ...' 'आकार' कीवर्ड का हास्यास्पद दुरुपयोग है, लेकिन, मैं भाषा नहीं लिखता, मैं बस इसका उपयोग करता हूं। :-) –

+8

'आकार ... (प्रकार)' और 'आकार (प्रकार) ...' के अंतर पर ध्यान दें। उत्तरार्द्ध बाइट्स गिन रहा है, पूर्व प्रकार की गिनती है :) –

3

यहां a link है जो आपकी मदद कर सकता है। लिंक से नमूना स्रोत:

template<typename... Args> struct count; 

template<> 
struct count<> { 
    static const int value = 0; 
}; 

template<typename T, typename... Args> 
struct count<T, Args...> { 
    static const int value = 1 + count<Args...>::value; 
}; 
+0

लिंक अब काम नहीं करता है, आप गिनती में 1 क्यों जोड़ते हैं? –

संबंधित मुद्दे