एक enum X : int
(C #) या enum class X : int
(C ++ 11) एक प्रकार है जिसका कोई छिपा हुआ आंतरिक क्षेत्र है, int
जो किसी भी मूल्य को पकड़ सकता है। इसके अलावा, एनफ पर कई पूर्वनिर्धारित स्थिरांक X
परिभाषित किए गए हैं। एनम को इसके पूर्णांक मूल्य और इसके विपरीत में डालना संभव है। यह C # और C ++ 11 दोनों में सही है।
C # enums में न केवल व्यक्तिगत मूल्यों को रखने के लिए उपयोग किया जाता है, बल्कि माइक्रोसॉफ्ट की सिफारिश के अनुसार, झंडे के बिटवाइज़ संयोजनों को रखने के लिए भी उपयोग किया जाता है । इस तरह की दुश्मनी (आमतौर पर, लेकिन जरूरी नहीं) [Flags]
विशेषता के साथ सजाए गए हैं । डेवलपर्स के जीवन को आसान बनाने के लिए, बिटवाइज़ ऑपरेटर (या, और आदि ...) अतिभारित होते हैं ताकि आप आसानी से ऐसा कुछ कर सकें (C #):
void M(NumericType flags);
M(NumericType.Sign | NumericType.ZeroPadding);
मैं एक अनुभवी C # डेवलपर हूं, लेकिन अब केवल कुछ दिनों के लिए C ++ प्रोग्रामिंग कर रहा हूं, और मुझे C ++ सम्मेलनों के साथ नहीं जाना जाता है। मैं ठीक उसी तरह से C ++ 11 Enum का उपयोग करने का इरादा रखता हूं जैसा कि मुझे C # करने के लिए किया गया था। C ++ 11 में scoped enums पर बिटवाइज़ ऑपरेटर्स ओवरलोडेड नहीं हैं, इसलिए मैं उन्हें ओवरलोड करना चाहता था ।
इसने एक बहस का आग्रह किया, और राय तीन विकल्पों के बीच भिन्न प्रतीत होती है:
एन # प्रकार के एक चर का उपयोग बिट फ़ील्ड को पकड़ने के लिए किया जाता है, C # के समान:
void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding)));
लेकिन यह C ++ 11 के स्कॉप्ड एनमों के दृढ़ता से टाइप किए गए एनम दर्शन का मुकाबला करेगा।
अगर आप किसी समरूप संयोजन को संग्रहित करना चाहते हैं तो एक सादे पूर्णांक का उपयोग करें:
void M(int flags); M(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding));
लेकिन यह सब कुछ को कम कर देगा
int
, जिससे आपको कोई सुराग नहीं मिलेगा कि आपको किस प्रकार की विधि डालनी है।एक अलग वर्ग लिखें जो ऑपरेटर्स को अधिभारित करेगा और एक छिपे हुए पूर्णांक फ़ील्ड में बिटवाइज़ फ़्लैग को रखेगा:
class NumericTypeFlags { unsigned flags_; public: NumericTypeFlags () : flags_(0) {} NumericTypeFlags (NumericType t) : flags_(static_cast<unsigned>(t)) {} //...define BITWISE test/set operations }; void M(NumericTypeFlags flags); M(NumericType::Sign | NumericType::ZeroPadding);
( user315052 द्वारा पूर्ण कोड )
लेकिन तब आपके पास कोई IntelliSense या संभावित मूल्यों पर आपको संकेत देने के लिए जो भी समर्थन है।
मुझे पता है कि यह एक व्यक्तिपरक प्रश्न है , लेकिन: मुझे किस दृष्टिकोण का उपयोग करना चाहिए? क्या दृष्टिकोण, यदि कोई है, तो C ++ में सबसे अधिक व्यापक रूप से मान्यता प्राप्त है? बिट फ़ील्ड के साथ काम करते समय आप किस दृष्टिकोण का उपयोग करते हैं और क्यों ?
बेशक, सभी तीन दृष्टिकोण काम करते हैं, मैं तथ्यात्मक और तकनीकी कारणों की तलाश कर रहा हूं, आम तौर पर स्वीकृत सम्मेलनों, और न केवल व्यक्तिगत पसंद।
उदाहरण के लिए, मेरी C # पृष्ठभूमि के कारण मैं C ++ में दृष्टिकोण 1 के साथ जाता हूं। इसका अतिरिक्त लाभ यह है कि मेरा विकास पर्यावरण मुझे संभावित मूल्यों पर संकेत दे सकता है, और अतिभारित एनम ऑपरेटरों के साथ यह लिखना और समझना आसान है, और काफी साफ है। और विधि हस्ताक्षर स्पष्ट रूप से दिखाता है कि यह किस प्रकार का मूल्य है। लेकिन यहां ज्यादातर लोग मुझसे असहमत हैं, शायद अच्छे कारण के लिए।
enum E { A = 1, B = 2, C = 4, };
, सीमा है 0..7
। (3 बिट्स) इस प्रकार, सी ++ मानक स्पष्ट रूप से गारंटी देता है कि # 1 हमेशा एक व्यवहार्य विकल्प हो जाएगा [विशेष रूप से,। enum class
डिफ़ॉल्ट enum class : int
जब तक अन्यथा निर्दिष्ट, और इस तरह हमेशा एक निश्चित अंतर्निहित प्रकार है।])