是否嵌套枚举类?

Uni*_*ant 4 c++ enums inner-classes

一个可以有独立的枚举类:

enum class StreamOpenMode
{
    read,
    write,
    readWrite
};

class Stream
{
public:

    Stream(StreamOpenMode openMode)
    //...
};
Run Code Online (Sandbox Code Playgroud)

或将它们嵌套在另一个类中:

class Stream
{
public:

    enum class OpenMode
    {
        read,
        write,
        readWrite
    };

    Stream(OpenMode openMode)
    //...
};
Run Code Online (Sandbox Code Playgroud)

选择一个而不是另一个的技术原因是什么?例如,不能预先声明嵌套的品种,这可能导致大型项目中的循环依赖问题。

Lig*_*ica 5

例如,不能预先声明嵌套的品种,这可能导致大型项目中的循环依赖问题。

公平地说,这本身可能是最强大的技术原因。

您还会发现依赖于参数的查找依赖于共享范围:

namespace N
{
   struct A
   {
      enum class B { aB };
      friend void f(B);
   };
}

void test(N::A::B x)
{
   f(x);  // f found by ADL, since x's type is a member of A
}
Run Code Online (Sandbox Code Playgroud)

一个不同的示例可以演示类似于的一整套Stream,每个类都有各自相似但范围不同的枚举。将其作为成员可以更轻松地从模板(T::OpenMode!)的上下文中使用所述范围枚举。但是,在那种情况下,成员类型别名会使将范围内的枚举保留在类之外变得非常简单。