استخدام ثنائي أعلام لتمثيل الدول, خيارات, الخ

StackOverflow https://stackoverflow.com/questions/1407197

  •  05-07-2019
  •  | 
  •  

سؤال

إذا أردت أن تمثل الدول أو الخيارات أو شيئا من هذا القبيل باستخدام ثنائي "الأعلام" حتى أتمكن من تمرير وتخزينها إلى كائن مثل OPTION1 | OPTION2 حيث OPTION1 هو 0001 ، OPTION2 هو 0010 ، حتى أن ما يحصل مرت 0011 يمثل مزيج من الخيارات.

كيف لي أن أفعل هذا في C++?لقد كنت أفكر في شيء مثل

enum Option {
    Option_1 = 0x01,
    Option_2 = 0x02,
    Option_3 = 0x04,
    //...
}

void doSomething(Option options) {
    //...
}

int main() {
    doSomething(Option_1|Option_2);
}

لكن من الناحية المثالية ، doSomething يعرف كيفية تفسير تعطى الخيار.

هل أنا على الطريق الصحيح ؟ هل هناك طريقة أفضل ؟

التحديث

و لا يجب تعريف Option كل تركيبة ممكنة أيضا ؟

هل كانت مفيدة؟

المحلول

هذا هو وسيلة شائعة تتم هذه الأمور. doSomething يمكن استخدام المعامل and مشغل لمعرفة ما إذا كان الخيار:

if (options & Option_1){ 
  // option 1 is selected
}

بدلا من ذلك, يمكنك أن تنظر في استخدام بت المجالات:

struct Options {
    unsigned char Option_1 : 1;
    unsigned char Option_2 : 1;
};

Options o;
o.Option_1 = 1;
o.Option_2 = 0;

نصائح أخرى

سيكون ذلك الطريقة التي كنت تفعل ذلك.ومع ذلك هناك العديد من الحيل التي يمكنك استخدامها لجعل التعداد قليلا أكثر قابلية للقراءة:

enum Option {
    Option1 = 1 /*<< 0*/,
    Option2 = 1 << 1,
    Option3 = 1 << 2,
    // etc.
};

ما هو أكثر, سوف تحتاج إلى تحديد المعامل مشغلي الخاص بك التعداد.النظر في شيء مثل ASL هو enum_ops المرافق للمساعدة مع هذا.

من الجدير بالذكر أن طريقة الناس عادة ما تستخدم هذه الأعلام هي تحديد وظيفة على النحو التالي:

void doSomething( unsigned int options ) 
{
    //...
}

كل شيء آخر سوف يعمل بالضبط كما تريد :)

الطريقة الأخرى هي أن إنشاء الخاصة بك "الأعلام" الطبقة.ثم لديك زوجين من الوظائف على النحو التالي في الصف:

bool GetOption( Option option )
{
    return (m_Option & option) > 0;
}

void SetOption( Option option )
{
    m_Option |= option;
}

void ClearOption( Option option )
{
    m_Option &= ~option;
}

أو حتى الزائد مشغلي أن تفعل بالضبط كما كنت ترغب هـ.g:

Flags( unsigned int options ) :
   m_Option( options )
{
}

Flags operator|( const Flags& flags )
{
    return Flags( m_Option | flags.m_Option );
}

وهلم جرا.

قد ترغب في التحقق المحكمة الخاصة بلبنان bitset.بعض الناس يعظ به أنه يجب عليك دائما استخدام تلك بدلا من C-أسلوب bitflags.بيد أن كل الحلول بخير المنظمة البحرية الدولية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top