【发布时间】:2010-09-14 14:42:18
【问题描述】:
有没有办法在 c++ 中找到枚举的最大和最小定义值?
【问题讨论】:
-
我可能想知道枚举的最大值而不将其添加到枚举本身的一个原因是,当我的“switch”语句未明确处理时,我的编译器不会抱怨(C4061) “最大值”值。
有没有办法在 c++ 中找到枚举的最大和最小定义值?
【问题讨论】:
尽管接受的答案正确地指出没有标准化的方法来获取enum 元素的min 和max 值,但在较新版本的 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
}
这无需任何自定义特征或提示即可工作。
这是一个非常粗略的概念证明,我相信它可以进一步扩展,这只是为了表明这在今天是可能的。
这个 sn-p 在 C++14 中编译,经过一些调整,它肯定也可以在 C++11 中运行,但我认为这在 C++ 之前的版本中是不可能的11
警告:这可能会在未来的编译器版本中中断。
【讨论】:
不,没有办法在 C++ 中找到任何枚举的最大和最小定义值。当需要此类信息时,定义 Last 和 First 值通常是一种很好的做法。例如,
enum MyPretendEnum
{
Apples,
Oranges,
Pears,
Bananas,
First = Apples,
Last = Bananas
};
First 和 Last 之间的每个值都不需要命名值。
【讨论】:
你甚至不需要它们,我所做的只是我说,例如,如果你有:
enum Name{val0,val1,val2};
如果您有 switch 语句并检查是否达到最后一个值,请执行以下操作:
if(selectedOption>=val0 && selectedOption<=val2){
//code
}
【讨论】:
enum My_enum
{
FIRST_VALUE = 0,
MY_VALUE1,
MY_VALUE2,
...
MY_VALUEN,
LAST_VALUE
};
定义后,My_enum::LAST_VALUE== N+1
【讨论】:
没有。 C 或 C++ 中的枚举只是一个常量列表。没有更高的结构可以保存这些信息。
通常当我需要这种信息时,我会在枚举中包含一个最大值和最小值,如下所示:
enum {
eAaa = 1,
eBbb,
eCccc,
eMin = eAaaa,
eMax = eCccc
}
请参阅此网页以了解这如何有用的一些示例:Stupid Enum Tricks
【讨论】:
不,不在标准 C++ 中。您可以手动完成:
enum Name
{
val0,
val1,
val2,
num_values
};
num_values 将包含枚举中值的数量。
【讨论】:
num_values 将包含枚举中值的数量,num_values 本身除外。