क्या कोई ऐसा फ़ंक्शन लिख सकता है जो enum में तत्वों की संख्या लौटाता है? उदाहरण के लिए, कहते हैं कि मैं परिभाषित किया है:क्या सी ++ में एनम के कार्डिनलिटी (आकार) को खोजने का कोई तरीका है?
enum E {x, y, z};
तो (ई) च 3.
क्या कोई ऐसा फ़ंक्शन लिख सकता है जो enum में तत्वों की संख्या लौटाता है? उदाहरण के लिए, कहते हैं कि मैं परिभाषित किया है:क्या सी ++ में एनम के कार्डिनलिटी (आकार) को खोजने का कोई तरीका है?
enum E {x, y, z};
तो (ई) च 3.
नहीं लौट आते हैं।
अगर वहाँ थे, तो आप इस तरह इतना कोड नहीं देख पा रहे हैं:
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
}
नहीं। एक बात के लिए, आप पैरामीटर के रूप में प्रकार नहीं ले सकते हैं (केवल प्रकार के उदाहरण)
नहीं, यह एक वीएफएचक्यू है और उत्तर नहीं है !!
वैसे भी बिना कूड़ेदान के।
यहां तक कि अंतिम प्रविष्टि के बारे में भी यह चाल केवल तभी काम करती है जब कोई भी मान गैर-डिफ़ॉल्ट न हो। जैसे,
enum B {
ONE, // has value = 0
TWO, // has value = 1
THREE=8, // because I don't like threes
COUNT // has value = 9
}
वहाँ तरीके हैं, लेकिन क्या आप किसी मैक्रो के साथ इसे प्राप्त कर सकते हैं काम करने के लिए ... थोड़ा :)
मूल रूप से की है।
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 क्योंकि यह काम करता है। हालांकि मुझे यकीन नहीं है कि मुझे घोषणा वाक्यविन्यास पसंद है। – ScaryAardvark
ठीक है, (सरणी, सूची, अनुक्रम और टुपल) से चुनने के लिए कुछ संरचनाएं हैं, मैं 'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6)) के लिए एक tuple का उपयोग कर सकता था;'। यह मैक्रोज़ की उपयोगिता का केवल एक प्रदर्शन था :) –
धन्यवाद, यह एक समाधान के रूप में अच्छा लगता है जैसा कि मैं आने वाला हूं। – rofrankel
निश्चित रूप से केवल निरंतर enums के लिए काम करता है। यदि आपके पास कभी भी एक त्रुटि कोड सूची में 'छेद' है, तो आप खराब हो गए हैं। –
मैंने एक साधारण मैक्रो पोस्ट किया जो चाल करता है और "छेद" मुद्दों को संभालता है। –