Я бы сказал, что перечисления - плохая идея для начала, но в целом для констант / многих вещей, таких как константы в C ++, ни одна из которых не является достаточно константой и у всех есть проблемы. Мне нравится помещать его в структуру, тогда классы, использующие его, наследуют от структуры.
Я бы также сказал, что идиома прыщей плохая. На самом деле я уверен, что это плохой способ делать вещи. Это то, что работает, но неуклюже и немного глупо. Этого также легко избежать, и единственная причина, по которой это происходит, заключается в том, что люди используют еще один неправильный выбор дизайна.
Обычно кто-то просто привязывает ООП к классу, который он задумал, чтобы быть конкретным. Затем вы получаете случай смешанного наследования и множество проблем, которые он вызывает, таких как супер медленное время компиляции. Вместо этого рассмотрите чистые виртуальные базовые классы, а затем напишите свои библиотеки для этого, чтобы избежать шаблонов и избежать проблемы прямого объявления. Не для всего, но определенно для случаев, когда вы генерируете код для большого количества классов.