C ++面向对象的bitMasks等价物

时间:2013-05-26 22:36:44

标签: c++ oop bitmask

保持简洁,现代行业接受的C ++中使用bitmasks的方法是什么?更具体地说,如何在函数声明中处理多个和可变数量的选项?

即。想象一下,你有一个带有可选和可变参数选项的函数,以及传递给系统调用的标志。

2 个答案:

答案 0 :(得分:0)

没有。 Bitmasks的工作方式与C中的相同。

答案 1 :(得分:0)

通过一些工作,与普通的类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 );
}

每当我创建一个位掩码时,我都会做这类事情,但我不能说我已经把它视为“行业接受”。