Подтвердить что ты не робот

Перечисление в пространстве имен

Есть ли смысл делать что-то вроде этого:

namespace status{
  enum status{
    ok,
    error
  };
}

и используйте его так: status::ok

Или я должен это сделать:

enum status{
  status_ok,
  status_error
};

и используйте его так: status_ok?

Update: С С++ 11 вы должны это сделать:

enum class status {
    ok,
    error
};

и используйте вот так: status::ok

4b9b3361

Ответ 1

Мне лично не нравится вторая вариация, потому что часть status_ кажется излишней для меня. Первая версия избегает этой проблемы, но наличие типа status::status выглядит странно. Кроме того, пространство имен открыто для модификации, поэтому, если кто-то сделал что-то вроде

namespace status {
  void error( const char *msg );
}

Вы получите ошибку компилятора, так как функция error столкнется с вашим значением enum.

Я предпочитаю использовать третью вариацию:

struct MouseButton {
  enum Value {
    Left, Middle, Right
  };
};

Это позволяет мне писать такие функции, как

void handleMouseButton( MouseButton::Value b ) {
  switch ( b ) {
    case MouseButton::Left:   // ...
    case MouseButton::Middle: // ...
    case MouseButton::Right:  // ...
  }
}

Ответ 2

То, что вы хотите, только что было добавлено в С++ при включении расширений С++ 0x. Однако, если вы не можете использовать функции С++ 0x, я предлагаю сделать это:

struct status
{
    enum value
    {
        ok,
        error
    };
};

С таким объявлением вы можете написать:

status::value var = status::ok;

Такая структура также позволит вам объявлять функции, относящиеся к типу состояния внутри области struct. Например, статус struct может содержать методы для преобразования в/из строки.

Ответ 3

Если вас не беспокоит использование типа enum status как такового, вы можете оставить его анонимным.

namespace status{
  enum {  // <--- no name
    ok,
    error
  };
}

Ответ 4

Во-первых, вы должны получить доступ к enum с помощью оператора области видимости, :: не оператор dot .; т.е. status::ok

Оба прекрасно понимают, что вы считаете более читабельными. Обратите внимание, что вы также можете использовать (без namespace)

enum status{
   ok,
   error
}

и по-прежнему использовать status::ok, но некоторые компиляторы предупреждают вас, что дополнительный status:: не нужен.

EDIT: доступ к enum с помощью ::, похоже, работает только с MS visual-С++

Ответ 5

Я предпочитаю подход пространства имен, поскольку он позволяет using namespace и использовать более короткие значения перечисления, если в куске кода используется только одно перечисление.

В основном это вопрос личных предпочтений, однако я считаю, что решающие (потенциальные) столкновения имен в С++ лучше всего делать с использованием пространств имен, так как это точка с именами в первую очередь.