C++ объектно-ориентированный эквивалент битовых масок

Говоря кратко и просто, как в современной индустрии принят способ создания битовых масок в C++? Чтобы быть более конкретным, как вы обрабатываете несколько и переменное количество опций в объявлениях вашей функции?

т.е. представьте, что у вас есть функция с необязательными и переменными параметрами, в том числе флаги, передаваемые системным вызовам.

2 ответа

Нет. Битовые маски работают так же, как и в C.

Немного поработав, вы можете получить дополнительную безопасность типов по сравнению с обычной C-подобной битовой маской.

#include <type_traits>

enum class MyOpts {
    OPT1 = 1<<0,
    OPT2 = 1<<1,
    OPT3 = 1<<2,
    OPT_ALL = OPT1 | OPT2 | OPT3
};

#define MYOPTS_BINARY_OP(OP) \
    inline MyOpts operator OP(MyOpts a, MyOpts b) { \
        using num_type = std::underlying_type<MyOpts>::type; \
        return static_cast<MyOpts>( static_cast<num_type>(a) OP \
                                    static_cast<num_type>(b) ); \
    } \
    inline MyOpts& operator OP ## = (MyOpts& a, MyOpts b) { \
        a = a OP b; \
        return a; \
    }

MYOPTS_BINARY_OP( | )
MYOPTS_BINARY_OP( & )
MYOPTS_BINARY_OP( ^ )
#undef MYOPTS_BINARY_OP

inline MyOpts operator~(MyOpts opts) {
    return static_cast<MyOpts>(
        ~static_cast<std::underlying_type<MyOpts>::type>(opts) & OPT_ALL );
}

Я обычно делаю подобные вещи всякий раз, когда создаю битовую маску, но я не могу сказать, что видел ее как "принятую индустрию".

Другие вопросы по тегам