【问题标题】:Nice way to declare enums in C++ without bloating the namespace在 C++ 中声明枚举而不会使命名空间膨胀的好方法
【发布时间】:2015-06-25 15:09:05
【问题描述】:

我注意到,如果我使用 Microsoft Visual Studio Express 2013 在 C++ 中做这样的事情:

namespace LogLevelEnum {
enum Type {
    ALL,
    FINEST,
    FINE,
    INFO,
    WARNING,
    SEVERE,
    OFF
};
}
typedef LogLevelEnum::Type LogLevel;

我可以使用LogLevel::INFOLogLevel::WARNING 之类的方式访问枚举 项,但不能简单地通过INFOWARNING 来访问。我喜欢这种方式,因为它不会在包含的命名空间中放入尽可能多的符号。

但是,我想知道这是否是标准行为。我知道可以使用:: 运算符对类和命名空间进行索引,但考虑到它们只是将所有内容转储到它所在的命名空间中,它也适用于枚举就不太有意义了。

【问题讨论】:

  • 只需使用scoped enum
  • C++11 枚举类?
  • @chris:啊,我不知道这些。我想我会用这些。不过,我仍然想知道我所使用的行为究竟是如何定义的。
  • 等一下,你用LogLevel typedef 实现了什么?没有它,你必须写 LogLevelEnum::INFO 一样,只是 INFO 不起作用,因为它在命名空间中。我错过了什么吗?
  • “但是,我想知道这是否是标准行为。” 它最初是一个 VC++ 扩展,但在 C++11 中与作用域枚举一起合法化。

标签: c++ enums namespaces standards


【解决方案1】:

但是,我想知道这是否是标准行为。

是的,前提是您使用的是符合 C++11 标准的编译器,并且按照标准,您指的是 C++11 标准。

但不是简单地执行 INFO 或 WARNING。

这是因为枚举在命名空间范围内。你试过LogLevelEnum ::INFOLogLevelEnum ::WARNING吗?

在 C++ 中声明枚举而不会使命名空间膨胀的好方法

在定义枚举时使用Scoped enumerationsenum struct | class 而不是enum

【讨论】:

  • 关于“这是因为枚举在命名空间范围内。您是否尝试过LogLevelEnum ::INFO或LogLevelEnum ::WARNING?”,这是我的意图。请注意我怎么说“我喜欢这样,因为它不会将尽可能多的符号放入包含的名称空间中。” 因为您的回答本质上是对 cme​​ts 的总结,并且 cmets 回答了我的问题,所以我会接受的。
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2011-09-17
  • 2023-03-13
  • 2018-08-05
  • 2019-07-22
相关资源
最近更新 更多