【发布时间】:2012-03-26 15:26:44
【问题描述】:
我有一些通用代码可以使用 C++11 enum class 类型指定的标志。一步,我想知道标志中的任何位是否已设置。目前,我正在使用代码:
if (flags != static_cast<E>(0)) // Works, but ugly.
我还可以强制用户为全零字段指定一个特定名称,这样更具可读性,但我的命名约定强加给使用它的任何人:
if (flags != E::none) // Works, if you manually define none = 0.
但这些都不像传统的那样好:
if (flags) // Doesn't work with class enums.
是否可以指定一个自定义函数来评估布尔上下文中的类枚举?
【问题讨论】:
-
您不能使用二进制标志是否有特定原因?它们干净高效。无论如何,枚举类值不能转换为数字。如果要枚举,则必须使用标志!= E::none。你知道,你可以只创建一个非枚举类并使用 static const int whatever = 1、static const int whatever_else = 2...等。并且只重载几个运算符。
-
@OrgnlDave:“二进制标志”是什么意思,布尔值?作为位域,它们通常是 IB/UB 并且定期对齐,如果我需要一次复制多个位域,我不会称它们为有效的,也不会干净。我没有看到建议静态整数的价值,我可以使用常规枚举并至少获得一点类型安全。
-
“我可以只使用一个常规枚举并获得至少一点类型安全性。”然后你必须接受这一点,同时你也不能再谈论比特了。
-
@GManNickG:不,我没有;枚举类的基本点之一是它们是命名特定(一组)值表示的类型安全方式。说位和类型安全是绝对没问题的。
-
@GManNickG:枚举类移除隐式转换为 int 但不隐藏或更改值表示。您仍然可以按字面意思指定值,您仍然可以使用 static_cast 而不是 reinterpret_cast,并且您仍然可以使用 std::underlying_type。