একটি 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এবং এভাবে সর্বদা একটি নির্দিষ্ট অন্তর্নিহিত ধরণের থাকে]]