перечисление в пространстве имен - PullRequest
20 голосов
/ 17 августа 2011

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

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

и использовать это так status::ok

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

enum status{
  status_ok,
  status_error
};

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

Обновление: С C ++ 11 вы теперь должны сделать это:

enum class status {
    ok,
    error
};

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

Ответы [ 5 ]

21 голосов
/ 17 августа 2011

Мне лично не нравится второй вариант, потому что часть 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:  // ...
  }
}
7 голосов
/ 17 августа 2011

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

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

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

status::value var = status::ok;

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

3 голосов
/ 17 августа 2011

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

namespace status{
  enum {  // <--- no name
    ok,
    error
  };
}
1 голос
/ 17 августа 2011

Во-первых, вы должны получить доступ к enum s, используя оператор области действия, ::, а не оператор точка .; т.е. status::ok

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

enum status{
   ok,
   error
}

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

РЕДАКТИРОВАТЬ: доступ к enum с использованием ::, кажется, работает только с MS visual-c ++

0 голосов
/ 17 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...