अंतिम अद्यतन:2026-10-12
C++ enum class स्ट्रॉन्ग टाइप्ड एनम¶
Effective modern C++ के Item 10: Prefer scoped enums to unscoped enum में कहा गया है कि बिना स्कोप वाले enum के स्थान पर स्कोप वाले enum class का उपयोग करें।
उदाहरण के लिए:
उपरोक्त त्रुटि इसलिए है क्योंकि दोनों circle एक ही स्कोप में हैं। enum के लिए यह निम्न के तुल्य है:
इसलिए बाद में circle को फिर से परिभाषित करने पर त्रुटि होगी।अतः चाहे enum का नाम जो भी हो, यदि उनके भीतर के मेंबरों में कोई नाम समान है, तो समस्या आएगी। उदाहरण के लिए:
a दो बार आया है, enum B के a वाले स्थान पर त्रुटि रिपोर्ट होती है।पहले की चर्चा से हम जानते हैं कि enum का नाम स्कोप की दृष्टि से कोई विशेष भूमिका नहीं निभाता, इसलिए हमें namespace का विचार आया, जैसा नीचे के उदाहरण में है:
// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
enum Enum {
Ground = 0,
Human,
Aerial,
Total
};
}
void foo(EntityType::Enum entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
लेकिन लगातार नेमस्पेस का उपयोग करना अनिवार्यतः बहुत कठिन हो जाता है, और यदि मैं namespace का उपयोग न करूँ और फिर भी ऐसा प्रभाव पाना चाहूँ, तो यह असुरक्षित हो जाता है तथा कोई बाध्यता (constraint) भी नहीं रहती।
इसीलिए c++11 के बाद enum class पेश किया गया।
enum class, enum मेंबरों के लिए टाइप परिभाषित करने, टाइप सुरक्षा तथा बाध्यता (constraint) जैसी समस्याओं को हल करता है। उपरोक्त उदाहरण पर लौटते हैं:
// enum class
enum class EntityType {
Ground = 0,
Human,
Aerial,
Total
};
void foo(EntityType entityType)
{
if (entityType == EntityType::Ground) {
/*code*/
}
}
संबंधित विषय¶
- C++ डिफ़ॉल्ट कंस्ट्रक्टर से बचना | C++那些事
- C++ क्लास इनिशियलाइज़र लिस्ट इडियम | C++那些事
- C++ में फ़ंक्शन टेम्पलेट की जगह क्लास टेम्पलेट | C++那些事
- C++ copy-and-swap इडियम | C++那些事
- C++ डिपेंडेंसी इंजेक्शन | C++那些事
- C++ Header-Only तथा कार्यान्वयन का पृथक्करण | C++那些事
- C++ लेज़ी इवैल्यूएशन इडियम | C++那些事
- C++ लुकअप टेबल इडियम | C++那些事
- C++ मेंबर पॉइंटर तथा टाइप जानकारी | C++那些事
- C++ Mixin इडियम | C++那些事