Гнездо enum class или нет? - PullRequest
4 голосов
/ 28 июня 2019

Можно иметь отдельные enum-классы:

enum class StreamOpenMode
{
    read,
    write,
    readWrite
};

class Stream
{
public:

    Stream(StreamOpenMode openMode)
    //...
};

Или вкладывать их в другой класс:

class Stream
{
public:

    enum class OpenMode
    {
        read,
        write,
        readWrite
    };

    Stream(OpenMode openMode)
    //...
};

Каковы технические причины выбора одного из других?Например, вложенный вариант не может быть объявлен заблаговременно, что может привести к проблемам круговой зависимости в больших проектах.

1 Ответ

5 голосов
/ 28 июня 2019

Например, вложенный вариант не может быть объявлен заблаговременно, что может привести к проблемам с циклической зависимостью в больших проектах.

Честно говоря, это, вероятно, самая сильная техническая причина.

Вы также обнаружите, что Аргумент-зависимый поиск зависит от общей области:

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, каждый из которых имеет свое собственное сходное, но отличающееся перечисление enum. Наличие его в качестве члена немного облегчает использование указанного перечисления с областью видимости из контекста шаблона (T::OpenMode!). Но в этом сценарии псевдонимы типов членов сделают довольно простым удержание перечисления enoped вне класса.

...