2010-02-02 12 views
6

क्या कोई ऐसा फ़ंक्शन लिख सकता है जो enum में तत्वों की संख्या लौटाता है? उदाहरण के लिए, कहते हैं कि मैं परिभाषित किया है:क्या सी ++ में एनम के कार्डिनलिटी (आकार) को खोजने का कोई तरीका है?

enum E {x, y, z}; 

तो (ई) च 3.

उत्तर

18

नहीं लौट आते हैं।

अगर वहाँ थे, तो आप इस तरह इतना कोड नहीं देख पा रहे हैं:

enum E { 
    VALUE_BLAH, 
    VALUE_OTHERBLAH, 
    ... 
    VALUE_FINALBLAH, 
    VALUE_COUNT 
} 

ध्यान दें कि यह कोड भी एक (बुरा) समाधान के लिए एक संकेत है - अगर आप एक अंतिम "गार्ड" जोड़ने तत्व, और स्पष्ट रूप से enum फ़ील्ड के मानों का राज्य नहीं है, तो पिछले "COUNT" तत्व मूल्य आप देख रहे हैं होगा - क्योंकि enum गिनती है ऐसा होता है शून्य आधारित:

enum B { 
    ONE, // has value = 0 
    TWO, // has value = 1 
    THREE, // has value = 2 
    COUNT // has value = 3 - cardinality of enum without COUNT 
} 
+0

धन्यवाद, यह एक समाधान के रूप में अच्छा लगता है जैसा कि मैं आने वाला हूं। – rofrankel

+0

निश्चित रूप से केवल निरंतर enums के लिए काम करता है। यदि आपके पास कभी भी एक त्रुटि कोड सूची में 'छेद' है, तो आप खराब हो गए हैं। –

+0

मैंने एक साधारण मैक्रो पोस्ट किया जो चाल करता है और "छेद" मुद्दों को संभालता है। –

2

नहीं। एक बात के लिए, आप पैरामीटर के रूप में प्रकार नहीं ले सकते हैं (केवल प्रकार के उदाहरण)

3

नहीं, यह एक वीएफएचक्यू है और उत्तर नहीं है !!

वैसे भी बिना कूड़ेदान के।

यहां तक ​​कि अंतिम प्रविष्टि के बारे में भी यह चाल केवल तभी काम करती है जब कोई भी मान गैर-डिफ़ॉल्ट न हो। जैसे,

enum B { 
     ONE, // has value = 0 
     TWO, // has value = 1 
     THREE=8, // because I don't like threes 
     COUNT // has value = 9 
     } 
+0

धन्यवाद। VFAQ को दोहराने के लिए खेद है - मैंने यहां और अधिक वेब दोनों खोजे हैं, और इस प्रश्न के किसी भी उदाहरण को नहीं मिला। – rofrankel

+0

कोई समस्या नहीं है। मैंने अक्सर यह जानने के लिए पर्याप्त खोज की है कि गुरु यह कहते हैं कि "cain't dun" – Mawg

4

वहाँ तरीके हैं, लेकिन क्या आप किसी मैक्रो के साथ इसे प्राप्त कर सकते हैं काम करने के लिए ... थोड़ा :)

मूल रूप से की है।

DEFINE_NEW_ENUM(MyEnum, (Val1)(Val2)(Val3 = 6)); 

size_t s = count(MyEnum()); 

यह कैसे काम करता है?

#include <boost/preprocessor/seq/enum.hpp> 
#include <boost/preprocessor/seq/size.hpp> 

#define DEFINE_NEW_ENUM(Type_, Values_)\ 
    typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\ 
    size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); } 

ध्यान दें कि लंबाई भी एक टेम्पलेट विशेषज्ञता या कुछ भी हो सकता है। मैं आपके बारे में नहीं जानता लेकिन मुझे वास्तव में BOOST_PP में "अनुक्रम" की अभिव्यक्ति पसंद है;)

+1

+1 क्योंकि यह काम करता है। हालांकि मुझे यकीन नहीं है कि मुझे घोषणा वाक्यविन्यास पसंद है। – ScaryAardvark

+0

ठीक है, (सरणी, सूची, अनुक्रम और टुपल) से चुनने के लिए कुछ संरचनाएं हैं, मैं 'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6)) के लिए एक tuple का उपयोग कर सकता था;'। यह मैक्रोज़ की उपयोगिता का केवल एक प्रदर्शन था :) –

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

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