Если у меня есть перечисление, определенное следующим образом:
enum CovariancesContext : int
{
INVALID = -1,
HORIZONTAL = 0,
VERTICAL = 1,
NUMBER_OF_CONTEXTS
};
Мне интересно, какова ценность или NUMBER_OF_CONTEXTS? Я думаю, должно быть 3?
«Я думаю, должно быть 3» — почему?
Это 2, поскольку значения перечисления получают следующее приращение, если у него нет значения. идиома использования «количества перечисляемых значений» работает только тогда, когда вы считаете от и между значениями нет дыр.
@Raildex Можете ли вы опубликовать свой ответ, пожалуйста? Спасибо.
Удалите значения инициализации, поэтому INVALID будет 0, и будет 3.
иногда то, что вам действительно нужно, это std::[unordered_]map<std::string,int>, а не перечисление.
@trojanfoe, значит, в перечислениях у меня будет два 0? Потому что и INVALID, и HORIZONTAL равны 0.
они сказали: «Удалите значения инициализации», если вы сделаете так, чтобы значения перечислителей начинались с 0 и увеличивались на 1, т.е. последнее - это количество перечислителей.
Нет, я предлагаю вам не инициализировать какие-либо перечисления. Часто вам нужно знать, сколько существует перечислений, чтобы настроить статический массив для сопоставления перечислений со строками в целях ведения журнала, поэтому вам нужно быть осторожным, если это ваш план.





Значение NUMBER_OF_CONTEXTS будет 2, а не 3.
Если вы не укажете значение для элемента перечисления, ему будет присвоено значение +1 предыдущего элемента или 0, если элемента нет. Поскольку VERTICAL имеет значение 1, NUMBER_OF_CONTEXTS будет 1+1=2.
Если вы хотите, чтобы NUMBER_OF_CONTEXTS в этом примере было равно 3, вам придется назначить его явно:
enum CovariancesContext : int
{
INVALID = -1,
HORIZONTAL = 0,
VERTICAL = 1,
NUMBER_OF_CONTEXTS = 3
};
что произошло, когда вы написали код для проверки значения? Какую ценность вы увидели?