استخدام ثنائي أعلام لتمثيل الدول, خيارات, الخ
سؤال
إذا أردت أن تمثل الدول أو الخيارات أو شيئا من هذا القبيل باستخدام ثنائي "الأعلام" حتى أتمكن من تمرير وتخزينها إلى كائن مثل 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.بيد أن كل الحلول بخير المنظمة البحرية الدولية.