Есть ли способ найти максимальное и минимальное определенные значения перечисления в С++?
Максимальное и минимальное значения в перечислении C++
Ответы (7)
Нет, невозможно найти максимальное и минимальное определенные значения любого перечисления в C++. Когда требуется информация такого рода, рекомендуется определить значения Last и First. Например,
enum MyPretendEnum
{
Apples,
Oranges,
Pears,
Bananas,
First = Apples,
Last = Bananas
};
Нет необходимости указывать именованные значения для каждого значения между First
и Last
.
Нет, не в стандартном C++. Вы можете сделать это вручную:
enum Name
{
val0,
val1,
val2,
num_values
};
num_values
будет содержать количество значений в перечислении.
num_values
будет содержать количество значений в перечислении, кроме самого num_values
.
- person dalle; 19.03.2014
Нет. Перечисление в C или C++ — это просто список констант. Нет вышестоящей структуры, в которой хранилась бы такая информация.
Обычно, когда мне нужна такая информация, я включаю в перечисление максимальное и минимальное значение примерно так:
enum {
eAaa = 1,
eBbb,
eCccc,
eMin = eAaaa,
eMax = eCccc
}
См. на этой веб-странице несколько примеров того, как это может быть полезно: Глупые трюки с перечислением
enum My_enum
{
FIRST_VALUE = 0,
MY_VALUE1,
MY_VALUE2,
...
MY_VALUEN,
LAST_VALUE
};
после определения My_enum::LAST_VALUE== N+1
Хотя в принятом ответе правильно указано, что не существует стандартизированного способа получить значения min
и max
элементов enum
, в более новых версиях gcc (›= 9.0) есть по крайней мере один возможный способ, который позволяет написать это:
enum class Fruits { Apples, Oranges, Pears, Bananas };
int main() {
std::cout << "Min value for Fruits is " << EnumMin<Fruits>::value << std::endl; // 0
std::cout << "Max value for Fruits is " << EnumMax<Fruits>::value << std::endl; // 3
std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(0)>().cStr() << std::endl; // Apples
std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(3)>().cStr() << std::endl; // Bananas
std::cout << "Name: " << getName<Fruits, static_cast<Fruits>(99)>().cStr() << std::endl; // (Fruits)99
}
Это работает без каких-либо пользовательских черт или подсказок.
Это очень грубое доказательство концепции, и я уверен, что его можно расширить, просто чтобы показать, что это возможно сегодня.
Этот фрагмент компилируется в C++14, и с некоторыми изменениями он определенно может работать и в C++11, но я не думаю, что это было бы возможно в версиях до C++11
ВНИМАНИЕ. Это может привести к поломке в будущих версиях компилятора.
Не автоматически, но вы можете добавить искусственные значения перечисления для обозначения минимальных и максимальных значений, например.
typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;
for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
....
}
они вам даже не нужны, я просто говорю, например, если у вас есть:
enum Name{val0,val1,val2};
если у вас есть оператор switch и чтобы проверить, было ли достигнуто последнее значение, выполните следующие действия:
if(selectedOption>=val0 && selectedOption<=val2){
//code
}