Рассмотрим класс C ++, который экспортирует перечисление, поддерживает внутренний массив над этим перечислением и хочет экспортировать команду, которая принимает значения из перечисления.
class foo {
public:
enum color {
red,
yellow,
green,
NUM_COLORS
};
private:
something somebody[NUM_COLORS];
public:
void command(color c);
};
Есть ли чистый способ экспортировать только актуальные цвета, но не NUM_COLORS? Я не хочу проверять крайний регистр при каждом вызове, когда система типов компилятора действительно должна быть в состоянии сделать это за меня.
Очевидный прием:
class foo {
public:
enum color {
red,
yellow,
green
};
private:
/* something like */ const unsigned NUM_COLORS = green+1;
unsigned LEDs_in_stock[NUM_COLORS];
public:
void command(color c);
};
Это, конечно же, бомба замедленного действия. , ожидая, что какой-нибудь бедный, перегруженный работой программист по обслуживанию добавит положения для синих светодиодов, и забыл обновить строку NUM_COLORS.
Позвольте мне немного уточнить. В данном конкретном случае я хочу сказать:
class foo {
public:
enum color {
red,
yellow,
green
};
void command(color c);
private:
something somebody[color];
};
Насколько я понимаю, C ++ этого не допускает.