একটি enum X : int
(সি #) বা enum class X : int
(সি ++ 11) এমন এক ধরণের যা একটি লুকানো অভ্যন্তরীণ ক্ষেত্র int
যা কোনও মান ধরে রাখতে পারে। এছাড়াও, X
এনামের উপর সংখ্যক পূর্বনির্ধারিত ধ্রুবক সংজ্ঞায়িত করা হয়। এনামটি তার পূর্ণসংখ্যার মান এবং বিপরীতে castালাই সম্ভব। এটি সি # এবং সি ++ 11 উভয় ক্ষেত্রেই সত্য।
সি # তে এনামগুলি কেবলমাত্র পৃথক মান ধরে রাখতে ব্যবহার করা হয় না, মাইক্রোসফ্টের সুপারিশ অনুসারে পতাকাগুলির বিটওয়াইস সংমিশ্রণগুলি ধারণ করতেও ব্যবহৃত হয় । এই জাতীয় এনামগুলি (সাধারণত, তবে অগত্যা নয়) [Flags]
গুণাবলী দিয়ে সজ্জিত । বিকাশকারীদের জীবনকে আরও সহজ করার জন্য, বিটওয়াইস অপারেটরগুলি (ওআর, এবং, ইত্যাদি ...) খুব বেশি লোড হয় যাতে আপনি সহজেই (সি #) এর মতো কিছু করতে পারেন:
void M(NumericType flags);
M(NumericType.Sign | NumericType.ZeroPadding);
আমি একজন অভিজ্ঞ সি # বিকাশকারী, তবে কেবল কয়েক দিন ধরে সি ++ প্রোগ্রামিং করছি, এবং আমি সি ++ কনভেনশনগুলির সাথে পরিচিত নই। আমি সি # তে যেমন ব্যবহার করতাম ঠিক ঠিক তেমনভাবে একটি সি ++ 11 এনাম ব্যবহার করার ইচ্ছা করি। সি ++ ১১-এ স্কোপড এনামগুলিতে বিটওয়াইস অপারেটরগুলি অতিরিক্ত লোড হয় না, তাই আমি সেগুলি ওভারলোড করতে চেয়েছিলাম ।
এটি একটি বিতর্ক চেয়েছিল, এবং তিনটি বিকল্পের মধ্যে মতামতগুলি পৃথক বলে মনে হচ্ছে:
এনাম টাইপের একটি পরিবর্তনশীল সি # এর মতো বিট ফিল্ডটি ধরে রাখতে ব্যবহৃত হয়:
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)));
তবে এটি সি ++ 11 এর স্কোপড এনামগুলির দৃ strongly়ভাবে টাইপযুক্ত এনাম দর্শনের বিরুদ্ধে লড়াই করতে পারে।
আপনি যদি এনামগুলির বিটওয়াইস সংমিশ্রণটি সঞ্চয় করতে চান তবে একটি সরল পূর্ণসংখ্যা ব্যবহার করুন:
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);
( ব্যবহারকারী 315052 দ্বারা সম্পূর্ণ কোড )
তবে তারপরে আপনার কোনও ইন্টেলিসেন্স বা সম্ভাব্য মানগুলি আপনাকে ইঙ্গিত করার জন্য কোনও সমর্থন নেই।
আমি জানি এটি একটি বিষয়গত প্রশ্ন , কিন্তু: আমার কোন পদ্ধতির ব্যবহার করা উচিত? কোন পদ্ধতির, যদি থাকে তবে সি ++ তে সর্বাধিক পরিচিতি পাওয়া যায়? বিট ক্ষেত্রগুলি নিয়ে কাজ করার সময় আপনি কোন পন্থা ব্যবহার করেন এবং কেন ?
অবশ্যই তিনটি পদ্ধতিরই কাজ, তাই আমি ব্যক্তিগত এবং ব্যক্তিগত পছন্দ নয়, সাধারণভাবে গৃহীত কনভেনশনগুলি বাস্তব এবং প্রযুক্তিগত কারণগুলির সন্ধান করছি।
উদাহরণস্বরূপ, আমার সি # ব্যাকগ্রাউন্ডের কারণে আমি সি ++ এ 1 পদ্ধতির সাথে যেতে চাই। এটির সাথে আমার বাড়তি পরিবেশের সম্ভাব্য মানগুলি সম্পর্কে ইঙ্গিত করতে পারে এমন অতিরিক্ত সুবিধা রয়েছে এবং ওভারলোডেড এনাম অপারেটরগুলির সাথে এটি লিখতে ও বোঝা সহজ এবং বেশ পরিষ্কার। এবং পদ্ধতি স্বাক্ষরটি পরিষ্কারভাবে দেখায় যে এটি কোন ধরণের মান প্রত্যাশা করে। তবে এখানকার বেশিরভাগ লোকই আমার সাথে একমত নন, সম্ভবত সঙ্গত কারণেই।
enum E { A = 1, B = 2, C = 4, };
ব্যাপ্তিটি 0..7
(3 বিট) Thus সুতরাং, সি ++ স্ট্যান্ডার্ড স্পষ্টভাবে গ্যারান্টি দেয় যে # 1 সর্বদা কার্যকর বিকল্প হবে [[বিশেষত অন্যথায় সুনির্দিষ্ট না করা হলে enum class
ডিফল্ট enum class : int
এবং এভাবে সর্বদা একটি নির্দিষ্ট অন্তর্নিহিত ধরণের থাকে]]