Перечисление в пространстве имен
Есть ли смысл делать что-то вроде этого:
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
Ответы
Ответ 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
и использовать более короткие значения перечисления, если в куске кода используется только одно перечисление.
В основном это вопрос личных предпочтений, однако я считаю, что решающие (потенциальные) столкновения имен в С++ лучше всего делать с использованием пространств имен, так как это точка с именами в первую очередь.