अब तक हमने ज़्यादातर संख्याएँ और स्ट्रिंग संभाली हैं। वास्तविक दुनिया को मॉडल करने के लिए, हम चाह सकते हैं कि एक वेरिएबल सीमित संख्या में वैल्यू ले सके। आप एक विशेष टाइप चाह सकते हैं जिसमें कुछ अलग-अलग नामों वाली कुछ अलग-अलग वैल्यू हों। उदाहरण के लिए, एक स्केटबोर्ड फैक्ट्री में, डेक की सामग्री केवल मेपल, बांस या प्लास्टिक में से चुनी जा सकती है।
आप उन वैल्यू को एन्कोड करने के लिए पूर्णांकों का उपयोग कर सकते हैं, लेकिन आपको यह जाँचने के लिए अतिरिक्त कोड लिखना पड़ेगा कि सिस्टम से सामग्री के लिए कोई अमान्य वैल्यू तो नहीं आ रही।
उन मैजिक संख्याओं का अर्थ सोर्स कोड में ढूँढना मुश्किल होता है और उनमें गड़बड़ी होने की संभावना रहती है।
enumerations का उपयोग स्पष्ट कोड को प्रोत्साहित करने और अनजाने में की गई तुलना की गलतियों को रोकने के लिए किया जा सकता है।
इस तरह के एन्यूमरेशन के लिए विशिष्ट शब्द scoped enumeration है।
नीचे दिया गया स्निपेट दिखाता है कि DeckMaterial enumeration कैसे लिखा जाता है।
परिभाषा के अंत में enum class कीवर्ड और ; पर ध्यान दीजिए:
enum class DeckMaterial {
maple,
bamboo,
plastic
};
अब स्केट शॉप में एक प्राइसिंग फंक्शन को देखिए और स्कोप रिज़ॉल्यूशन ऑपरेटर (::) पर ध्यान दीजिए जो enumeration से एक enumerator निर्दिष्ट करता है:
double deck_price(double base_price, DeckMaterial material) {
if(material == DeckMaterial::plastic) {
return base_price * 0.9;
}
return base_price * 1.3;
}
कल्पना कीजिए कि आपके पास व्हील मटेरियल के लिए एक दूसरा enumeration है:
enum class WheelMaterial {
steel,
clay,
plastic
};
हालाँकि पहिये और डेक दोनों प्लास्टिक के बने हो सकते हैं, पर इन दोनों को आपस में भ्रमित नहीं किया जा सकता।
वे अलग-अलग टाइप हैं: DeckMaterial प्लास्टिक और WheelMaterial प्लास्टिक।
प्रत्येक enumeration के enumerators उसके अपने स्कोप में होंगे, यानी उसके अपने namespace में।
इसी कारण उन्हें scoped enumerations कहा जाता है।
आप सोच रहे होंगे कि scoped जैसे नाम के साथ unscoped एन्यूमरेशन भी होंगे, और आप सही होंगे।
Unscoped enumerations कम लोकप्रिय हो रहे हैं क्योंकि वे सभी एक ही ग्लोबल नेमस्पेस साझा करते हैं।
साझा करने के कारण, आपके पास ऊपर के उदाहरण में प्लास्टिक जैसे समान enumerators वाले दो unscoped enumerations नहीं हो सकते।
साथ ही, unscoped enumerations स्वतः पूर्णांकों में बदल जाते हैं।
आश्चर्यजनक परिणाम के लिए नीचे दिया गया उदाहरण देखिए:
enum CitrusFruits {
lemons, // 0
oranges, //1
};
enum IceCream {
walnut, // 0
apples, // 1
};
bool comparison{apples == oranges};
// => true
// Example from above:
bool comparison{DeckMaterial::plastic == WheelMaterial::plastic};
// => Does not compile!
यदि आप scoped enumerations को पूर्णांकों में बदलना चाहते हैं तो आप static_cast<int> का उपयोग कर सकते हैं।