У меня есть фиксированный набор категорий для конкретных доменов. Каждая категория идентифицируется соответствующим постоянным значением (полезным само по себе) перечислимого типа. Кроме того, каждая категория имеет фиксированный набор подкатегорий. Каждая подкатегория должна быть идентифицирована соответствующим постоянным значением (также полезным), уникальным в этой категории, но НЕ уникальным для категорий.
Я пытаюсь найти способ объявить идентификаторы для моих подкатегорий, «подчиненные» идентификаторам для категорий, т.е. так, чтобы к идентификатору подкатегории можно было получить доступ через связанный идентификатор категории с разрешением во время компиляции.
Как правильно сделать это в C ++ 14?
Идентификаторы - это просто постоянные значения перечислимого типа (пусть основанные на int).
Вот что я пробовал:
enum Category
{
One = 1,
Two = 2,
Three = 3
};
template<Category categoryName> struct Subcategory;
template<> struct Subcategory<Category::One>
{
enum
{
A = 0,
B = 1
};
};
Мы можем получить доступ к идентификатору подкатегории через Subcategory<Category::One>::A
(не волнение ...)
Выражение выглядит слишком длинным, и я пытаюсь найти решение, дающее несколько более сжатое выражение для доступа к A. Последнее средство на этом пути - сделать первое перечисление безымянным ...
На самом деле, как заметил Pepper_chico, выражение сокращено до Subcategory<One>::A
. Есть ли решение (вероятно, не на основе шаблона), которое позволило бы избавиться от идентификатора Subcategory
, оставив только One
и A
?
enum class
, вы можете без проблем превратитьSubcategory<Category::One>::A
вSubcategory<One>::A
, разве этого не достаточно? - person pepper_chico   schedule 28.10.2014One_A
,One_B
. Есть причина, по которой вы этого не хотите? - person Mooing Duck   schedule 28.10.2014One
в идентификаторах подкатегорий (и имя идентификатора категории, конечно, может быть длиннее). - person user3900460   schedule 28.10.2014using SubOne = Subcategory<One>;
, но вы просто создаете псевдоним. - person pepper_chico   schedule 28.10.2014using
, необходимым для каждой подкатегории, вы могли затем получить доступ к материалам с помощьюSubOne::A
,SubTwo::A
и т. Д. - person pepper_chico   schedule 28.10.2014