是否巢枚举课

Nest enum class or not?

本文关键字:枚举 是否      更新时间:2023-10-16

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

enum class StreamOpenMode
{
    read,
    write,
    readWrite
};
class Stream
{
public:
    Stream(StreamOpenMode openMode)
    //...
};

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

class Stream
{
public:
    enum class OpenMode
    {
        read,
        write,
        readWrite
    };
    Stream(OpenMode openMode)
    //...
};

选择一个技术原因是什么?例如,嵌套的品种无法正向声明,这可能会导致大型项目中的循环依赖性问题。

例如,嵌套的品种无法正向声明,这可能会导致大型项目中的循环依赖问题。

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

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

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
}

一个不同的示例可以演示类似于Stream的类的整个类别,每个类别都有自己的相似但不同的范围。将其作为成员使其更容易从模板的上下文(T::OpenMode!(中使用所述范围的枚举。但是,在这种情况下,成员类型的别名将使将范围的枚举保持在班级外。