enum X : int
(C #) หรือenum class X : int
(C ++ 11) เป็นชนิดที่มีเขตข้อมูลภายในที่ซ่อนของint
ที่สามารถเก็บค่าใด ๆ นอกจากนี้ค่าคงที่จำนวนหนึ่งที่กำหนดไว้ล่วงหน้าของX
จะถูกกำหนดไว้ใน enum เป็นไปได้ที่จะส่งค่า enum ให้เป็นค่าจำนวนเต็มและในทางกลับกัน ทั้งหมดนี้เป็นจริงทั้งใน C # และ C ++ 11
ใน C # enums ไม่ได้ใช้เพียงเพื่อเก็บค่าของแต่ละบุคคล แต่ยังถืออยู่รวมกันค่าที่เหมาะสมของธงตามคำแนะนำของไมโครซอฟท์ เช่น enums (ปกติ แต่ไม่จำเป็น) ตกแต่งด้วย[Flags]
แอตทริบิวต์ เพื่อทำให้ชีวิตของนักพัฒนาง่ายขึ้นผู้ประกอบการระดับบิต (OR, และอื่น ๆ ... ) จะได้รับการโหลดมากเกินไปเพื่อให้คุณสามารถทำสิ่งนี้ได้อย่างง่ายดาย (C #):
void M(NumericType flags);
M(NumericType.Sign | NumericType.ZeroPadding);
ฉันเป็นนักพัฒนา C # ที่มีประสบการณ์ แต่ได้เขียนโปรแกรม C ++ เพียงสองสามวันแล้วและตอนนี้ฉันยังไม่รู้จักกับการประชุม C ++ ฉันตั้งใจจะใช้ C ++ 11 enum ในลักษณะเดียวกับที่เคยทำใน C # ใน C ++ 11 ผู้ประกอบการระดับบิตบน enums ขอบเขตจะไม่มากเกินไปดังนั้นผมอยากจะเกินพวกเขา
สิ่งนี้เรียกร้องให้มีการถกเถียงกันและความคิดเห็นดูเหมือนจะแตกต่างกันระหว่างสามตัวเลือก:
ตัวแปรชนิด enum ถูกใช้เพื่อเก็บฟิลด์บิตคล้ายกับ C #:
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)));
แต่สิ่งนี้จะตอบโต้ปรัชญา enum ที่พิมพ์ออกมาอย่างมากของการกำหนดขอบเขตของ C ++ 11
ใช้จำนวนเต็มธรรมดาหากคุณต้องการเก็บค่าจำนวนเต็มรวม enums:
void M(int flags); M(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding));
แต่สิ่งนี้จะลดทุกสิ่งทุกอย่างเป็น a
int
ทำให้คุณไม่มีเงื่อนงำว่าคุณควรจะใช้วิธีการแบบไหนเขียนคลาสที่แยกจากกันซึ่งจะโอเวอร์โหลดโอเปอเรเตอร์และเก็บค่าสถานะ bitwise ในฟิลด์จำนวนเต็มที่ซ่อนอยู่:
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);
( รหัสเต็มโดยuser315052 )
แต่คุณไม่มี IntelliSense หรือการสนับสนุนใด ๆ ที่จะบอกใบ้คุณถึงค่าที่เป็นไปได้
ฉันรู้ว่านี่เป็นคำถามส่วนตัวแต่: ฉันควรใช้วิธีใด ถ้ามีวิธีการใดที่ได้รับการยอมรับอย่างกว้างขวางที่สุดใน C ++ คุณใช้วิธีการใดเมื่อจัดการกับบิตฟิลด์และเพราะเหตุใด
แน่นอนว่าวิธีการทั้งสามนี้ใช้ได้ผลฉันกำลังมองหาเหตุผลที่เป็นข้อเท็จจริงและเทคนิคการประชุมที่ยอมรับโดยทั่วไปไม่ใช่การตั้งค่าส่วนตัว
ตัวอย่างเช่นเนื่องจากพื้นหลัง C # ของฉันฉันมักจะไปกับวิธีที่ 1 ใน C ++ สิ่งนี้มีประโยชน์เพิ่มเติมที่สภาพแวดล้อมการพัฒนาของฉันสามารถบอกใบ้ให้ฉันเห็นถึงคุณค่าที่เป็นไปได้และด้วยตัวดำเนินการ enum ที่มากเกินไปทำให้เขียนและเข้าใจได้ง่ายและสะอาดมาก และลายเซ็นวิธีการแสดงให้เห็นชัดเจนว่ามูลค่าคาดว่า แต่คนส่วนใหญ่ที่นี่ไม่เห็นด้วยกับฉันอาจเป็นเพราะเหตุผลที่ดี
enum E { A = 1, B = 2, C = 4, };
ช่วงคือ0..7
(3 บิต) ดังนั้นมาตรฐาน C ++ รับรองอย่างชัดเจนว่า # 1 จะเป็นตัวเลือกที่ทำงานได้ [โดยเฉพาะenum class
ค่าเริ่มต้นenum class : int
เว้นแต่จะระบุไว้เป็นอย่างอื่นและมีประเภทพื้นฐานที่แน่นอน])