【发布时间】:2012-08-17 02:07:35
【问题描述】:
您能否使用枚举类实现符合标准(如 n3242 草案的 17.5.2.1.3 中所述)类型的安全位掩码?我读它的方式,如果类型 T 支持 |,&,^,~,|=,&= 和 ^= 运算符,则它是位掩码,并且您可以进一步执行 if(l&r) 其中 l 和 r 属于 T 类型. 列表中缺少运算符 != 和 == 并允许排序一个可能还想重载 <.>
让操作员工作只是烦人的样板代码,但我不知道该怎么做 if(l&r)。至少以下内容不能使用 GCC 编译(除了极其危险,因为它允许错误地隐式转换为 int):
enum class Foo{
operator bool(){
return (unsigned)*this;
}
};
编辑:我现在确定枚举类不能有成员。但是,如何做 if(l&r) 的实际问题仍然存在。
【问题讨论】:
-
枚举类甚至可以有成员函数吗?
-
我没有看到任何要求位掩码类型可以隐式转换为
bool;为什么if (l&r)必须格式正确? -
你有没有考虑过……不打扰?就个人而言,我一直将类型安全枚举视为一种合理保证枚举值始终是其枚举类型之一的方法。如果你可以对它们进行按位运算,那么这个假设是错误的(通过你需要编译的
static_casts 的数量来证明)。在我看来,如果你想要一个位域,你应该使用enum,而不是enum class。 -
我已经编写了诸如模板之类的运算符,并且我使用
has_flags函数来测试一个值是否设置了所有特定的标志集。我发现它比&好很多,因为它可以检查多个标志而不会出错(写(l&r)而不是(l&r)==r);而且可读性更强。 -
@aschepler,你在和谁说话?问题是关于范围枚举,所以这不是真的。
标签: c++ c++11 bit-fields bitmask enum-class