Я хочу сопоставить значения (перечислимого) перечисления с некоторыми другими значениями. Например, здесь я карта Color
к другому перечислению Group
:Перечисление enum устойчивое к рефакторингу
enum class Color {
Red, Green, Blue, Cyan, Magenta, Yellow, White, Black,
COUNT // Needed to know the number of items
};
enum class Group {
Primary, Secondary, Neutral
};
Group GetGroupOfColor(Color color); // Mapping function I'm going to implement
Я хочу, чтобы убедиться, что если кто-то изменяет количество элементов в Color
перечисления, то эта функция не будет компилироваться.
я придумал единственное решение этой проблемы:
Group GetGroupOfColor(Color color)
{
static const Group color2group[] = {
Group::Primary, // Red
Group::Primary, // Green
Group::Primary, // Blue
Group::Secondary, // Cyan
Group::Secondary, // Magenta
Group::Secondary, // Yellow
Group::Neutral, // White
Group::Neutral // Black
};
static_assert(ARRAY_SIZE(color2group) == size_t(Color::COUNT), "DEADBEEF!");
auto index = size_t(color);
assert(index < size_t(Color::COUNT));
return color2group[index];
}
где ARRAY_SIZE
могут быть реализованы как следующие:
template <typename T, size_t N>
constexpr size_t ARRAY_SIZE(T(&)[N])
{
return N;
}
Эта реализация делает то, что я хочу, но у него есть куча недостатков:
- Добавляет этот уродливый
COUNT
элемент вColor
перечислении (беспокоит меня больше всего) - потерпит неудачу тихо, если кто-то сортирует предметы
Color
- Не применимо для не непрерывных перечислений, т.е. с явно заданными значениями (это один не очень важно)
Мой вопрос: Есть ли способ улучшить эту реализацию? Возможно, какой-то другой подход, о котором я даже не думал. Возможно, с его собственными недостатками, которые я нахожу менее раздражающими.
Смотрите также:
Весь смысл перечислений в том, что они, как предполагается, быть полностью отдельными типами. Ваш лучший подход состоит в том, чтобы явно закодировать преобразование с помощью оператора switch, но вам нужно будет обеспечить синхронизацию обоих перечислений, а код преобразования будет изменен при изменении одного из перечислений. – Mawg