【发布时间】:2014-12-05 16:38:11
【问题描述】:
我没有在 C++11 标准中找到任何说明不推荐使用无作用域枚举的措辞,但从实用的角度来看,我想知道它们是否仍然有用。我团队中的很多人都养成了将非作用域枚举转换为作用域枚举的习惯,但这引起了一些头痛:
class foo
{
public:
enum MyEnum { One, Two, Three };
};
他们将其转换为:
class foo
{
public:
enum class MyEnum { One, Two, Three };
};
这意味着当使用这些枚举器时,它看起来像foo::MyEnum::One,而不是foo::One。我一直在询问以下最佳实践:
- 如果您转换为作用域枚举,请将其移出类并移入全局作用域或命名空间作用域(以提高可用性并避免上面的后一个用法示例)。
- 如果您保持枚举无范围,请确保它在命名空间/类/函数/等范围内,以免与其他名称冲突。
这两点之间的主要区别在于,对于 #1,我们没有将它们放在类中,否则会增加一些冗长的间接性。
所有这一切似乎都过于复杂了,而且将已经存在于类中的枚举保留为无作用域的枚举似乎要简单得多。在两者之间做出决定的一般最佳实践方法是什么?
【问题讨论】:
-
切换到
enum class的好处是你可以读到关于为什么添加它的所有信息;切换到enum class的缺点是您在上面写的所有内容。但是,这并没有告诉我们从头开始编写代码时应该做什么。 -
第二次使用有什么问题?
-
@Daniel Verbosity。这就像为您的对象使用 2 个嵌套命名空间,而只有 1 个就足够了。
-
“只是将已经存在于类中的枚举保留为无范围的枚举”——这有时是明智的,有时不是。如果你想在同一个类中有两个枚举怎么办?
-
@MORTAL:如果你
static_casting 你的作用域枚举,那么你完全错过了重点,你的代码是错误的。