如何将 bitmask_operators.hpp 与命名空间和 类 一起使用
How to use bitmask_operators.hpp with namespace and classes
我想使用 C++11 enum class
作为位域并找到一个不错的方法 here。
但我卡住了,如果我的枚举 class 声明不在全局命名空间中,而是在自定义命名空间中或 class 内部。例如:
#define ENABLE_BIT_OPERATORS(E) template<> struct enable_bitmask_operators<E> { static constexpr bool enable=true; };
// anonymous namespace
namespace {
enum class Ean {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ean)
} // anonymous namespace
// custom namespace
namespace Custom {
enum class Ecn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecn)
} // custom namespace
// inside class in global namespace
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
// inside class in anonymous namespace
namespace {
class MyclassAN {
public:
enum class Ecan {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecan)
};
} // anonymous namespace
// inside class in custom namespace
namespace Custom {
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
} // custom namespace
这总是给我错误:
error: specialization of 'template<class E> struct enable_bitmask_operators' in different namespace
直到我将我的模板专业化放置到与 bitmask_operators.hpp
中的模板 enable_bitmask_operators
所在的同一名称空间(在本例中为全局名称空间)。
但我想让我的专业化接近我的枚举 class 声明。
在提到的article中,Jay Miller 也评论了这个问题,似乎他提供了解决方案。但是我没有按照他的提示在 bitmask_operators.hpp
.
中解决这个问题
示例代码 here.
编辑/部分解决: 与此同时,我得到了它的工作(只是一个转储复制和粘贴问题和神秘的错误消息;-)。我刚刚通过应用 Jay Millers constexpr 函数解决方案更新了我的 example code。
但是在 class 中声明枚举 class 时仍然存在问题。问题出现了,当我向我的 class 添加一个 ctor 时,例如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};
然后我得到一个错误:
enclosing class of constexpr non-static member function 'bool MyclassGN::enable_bitmask_operators(MyclassGN::Ecgn)' is not a literal type
好吧,我通过添加 static
关键字解决了这个问题:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};
但是当我尝试使用位掩码运算符时出现下一个问题,例如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_): e(e_) {
e |= Ecgn::Bit3;
}
private:
Ecgn e;
};
我收到一个错误:
no match for 'operator|=' (operand types are 'MyclassGN::Ecgn' and 'MyclassGN::Ecgn')
显示错误的更新示例位于 here。
示例代码,基于 Anthony Williams 的 bitmask_operators.hpp
并应用了 Jay Millers 的建议(constexpr 函数而不是 template<> 结构)来修复命名空间问题位于 here.
请注意,在 class 内声明枚举 class 时,constexpr 函数需要在 friend
关键字之前(正如 dyp 在下面的评论中所建议的那样)。示例:
class Myclass {
public:
enum class E {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
friend ENABLE_BIT_OPERATORS(E)
};
我想使用 C++11 enum class
作为位域并找到一个不错的方法 here。
但我卡住了,如果我的枚举 class 声明不在全局命名空间中,而是在自定义命名空间中或 class 内部。例如:
#define ENABLE_BIT_OPERATORS(E) template<> struct enable_bitmask_operators<E> { static constexpr bool enable=true; };
// anonymous namespace
namespace {
enum class Ean {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ean)
} // anonymous namespace
// custom namespace
namespace Custom {
enum class Ecn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecn)
} // custom namespace
// inside class in global namespace
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
// inside class in anonymous namespace
namespace {
class MyclassAN {
public:
enum class Ecan {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecan)
};
} // anonymous namespace
// inside class in custom namespace
namespace Custom {
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
} // custom namespace
这总是给我错误:
error: specialization of 'template<class E> struct enable_bitmask_operators' in different namespace
直到我将我的模板专业化放置到与 bitmask_operators.hpp
中的模板 enable_bitmask_operators
所在的同一名称空间(在本例中为全局名称空间)。
但我想让我的专业化接近我的枚举 class 声明。
在提到的article中,Jay Miller 也评论了这个问题,似乎他提供了解决方案。但是我没有按照他的提示在 bitmask_operators.hpp
.
示例代码 here.
编辑/部分解决: 与此同时,我得到了它的工作(只是一个转储复制和粘贴问题和神秘的错误消息;-)。我刚刚通过应用 Jay Millers constexpr 函数解决方案更新了我的 example code。
但是在 class 中声明枚举 class 时仍然存在问题。问题出现了,当我向我的 class 添加一个 ctor 时,例如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};
然后我得到一个错误:
enclosing class of constexpr non-static member function 'bool MyclassGN::enable_bitmask_operators(MyclassGN::Ecgn)' is not a literal type
好吧,我通过添加 static
关键字解决了这个问题:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};
但是当我尝试使用位掩码运算符时出现下一个问题,例如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_): e(e_) {
e |= Ecgn::Bit3;
}
private:
Ecgn e;
};
我收到一个错误:
no match for 'operator|=' (operand types are 'MyclassGN::Ecgn' and 'MyclassGN::Ecgn')
显示错误的更新示例位于 here。
示例代码,基于 Anthony Williams 的 bitmask_operators.hpp
并应用了 Jay Millers 的建议(constexpr 函数而不是 template<> 结构)来修复命名空间问题位于 here.
请注意,在 class 内声明枚举 class 时,constexpr 函数需要在 friend
关键字之前(正如 dyp 在下面的评论中所建议的那样)。示例:
class Myclass {
public:
enum class E {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
friend ENABLE_BIT_OPERATORS(E)
};