এতদিন আমরা মূলত সংখ্যা আর স্ট্রিং নিয়েই কাজ করেছি। বাস্তব জগৎকে মডেল করতে চাইলে আমাদের এমন কিছু মান দরকার হতে পারে, যার মধ্যে একটি ভ্যারিয়েবল কেবল সীমিত কয়েকটিই গ্রহণ করতে পারবে। আপনার হয়তো একটি নির্দিষ্ট টাইপ দরকার, যার অল্প কয়েকটি স্বতন্ত্র মান আছে এবং প্রতিটির আলাদা নাম আছে। যেমন একটি স্কেটবোর্ড কারখানায় ডেকের উপাদান কেবল ম্যাপল, ব্যাম্বু বা প্লাস্টিকের মধ্যে সীমাবদ্ধ থাকতে পারে।
ওই মানগুলো ইন্টিজার দিয়ে এনকোড করা যেত, কিন্তু উপাদানের জন্য সিস্টেম থেকে কোনো ভুল মান আসছে কি না, তা যাচাই করতে অতিরিক্ত কোড লিখতে হতো।
সোর্স কোডের ভেতর দিয়ে ম্যাজিক সংখ্যা-গুলোর অর্থ খুঁজে বের করা কঠিন, আর এগুলোতে গোলমাল হয়ে যাওয়ার আশঙ্কাও থাকে।
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 ক্রমশ কম জনপ্রিয় হয়ে উঠছে, কারণ এরা সবাই একই গ্লোবাল নেমস্পেস ভাগ করে নেয়।
এই ভাগাভাগির কারণেই উপরের উদাহরণের plastic-এর মতো একই 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> ব্যবহার করতে পারেন।