Управление видимостью значений перечисления

Рассмотрим класс 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 ++ этого не допускает.

6
задан John R. Strohm 1 April 2011 в 17:29
поделиться