Разные перечисления, одинаковое значение

Можно ли сделать два разных перечисления с одинаковым значением?
Например,

enum direction{
LEFT,
RIGHT,
UP,
DOWN,
NONE
}
enum color{
RED,
GREEN,
BLUE,
NONE
}

Компилятор сказал бы, что есть два объявления NONE.
Это можно обойти?

2

Решение

Есть несколько способов обойти это. Одним из способов является использование пространств имен для переноса перечислений и предотвращения загрязнения этими значениями глобального пространства имен:

namespace direction {
enum direction {
LEFT,
RIGHT,
UP,
DOWN,
NONE
};
}
namespace color {
enum color {
RED,
GREEN,
BLUE,
NONE
};
}

Вы также можете использовать новый способ C ++ 11 (если ваш компилятор его поддерживает) и использовать «строго типизированные перечисления»

enum class direction {
LEFT,
RIGHT,
UP,
DOWN,
NONE
};
enum class color {
RED,
GREEN,
BLUE,
NONE
};

Оба могут быть использованы синтаксисом direction::NONE или же color::NONE но есть одно важное отличие. В первом случае перечисления по-прежнему неявно приводятся к целым числам. Это означает, что вы можете написать

int foo = direction::NONE;

и все хорошо.

Во втором случае это будет ошибка компилятора, так как foo не того же типа, что и direction. Вы можете обойти это, делая

direction foo = direction::NONE;

который может или не может работать для вас. Если вам нужно привести его к int, вы можете использовать static_cast<int>(foo) чтобы получить целочисленный тип.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]