Упаковка наборов перечислений - PullRequest
0 голосов
/ 30 ноября 2018

Я пытался создать основной тип перечисления с дочерними перечислениями, чтобы улучшить читаемость и использование.Вот пример того, что я имею в виду:

enum TileType {
   enum Ground {
      FLAT,
      SLOPE // ...
   },
   enum Props {
      SIGN // ...
   }
   // ...
};

, на который можно ссылаться как TileType type = TileType::Ground::FLAT для лучшей иерархии.

Я думал об обертывании перечислений в пространстве имен:

namespace TileType {
   enum Ground {
      FLAT,
      SLOPE // ...
   };
   enum Props {
      SIGN // ...
   };
   // ...
};

Я могу использовать его как int TileType::Ground::FLAT, но я не смогу различить Ground из Props, поскольку Ground::FLAT и Props::SIGN оба будут равны 0.

Использованиеenum class может быть то, что я ищу, но я не смогу получить TileType type = TileType::Ground::Flat, так как каждое перечисление будет различным классом.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018
enum TileTypes
{
    GroundTypes = 1000
    PropTypes = 2000
}

enum Ground
{
    FIRST_GROUND = GroundTypes,
    FLAT = FIRST_GROUND,
    SLOPE,
    ...,
    INVALID_GROUND
}

enum Props
{
    FIRST_PROP = PropTypes,
    SIGN = FIRST_PROP,
    ...,
    INVALID_PROP
}

Так я обычно работаю с определениями группируемых типов для постоянных структур.Преимущества здесь:

  • Подтипы могут быть вложены по желанию
  • Существуют промежутки между значениями разных подтипов, так что значения Props не зависят от количества типов Ground.
  • Легко проверить, имеет ли значение тип

    bool isGround(int value) { return FIRST_GROUND <= value && INVALID_GROUND > value; }

  • Легко читаемый и не очень сложныйсинтаксис

0 голосов
/ 30 ноября 2018

Перечисление перечислений, как правило, не является хорошей практикой.

Подумайте над тем, чтобы заключить перечисления в структуру (или отдельные структуры) или, что лучше, в класс.

Что касается обоих перечислений, начинающихся с 0, вы можете сделать то, что предложили некоторые комментарии, или выбрать начальные диапазоны, сильно отличающиеся друг от друга.

Но это контекстная вещь, которую программист должен решить (я не вижу проблемы с обоими, начинающимися с 0, пока переменные различают типы).

Пример

struct TileType 
{
   enum Ground {
      FLAT = 0,
      SLOPE = 1, // ...
   };
   enum Props {
      SIGN = 9999 // ...
   };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...