我对CPP编程很陌生。我有一个enum:
emun foo
{
Apple,
Banana,
Orange
}
例如,foo::Banana
打印1
,但如果我有1
,如何打印Banana
到输出?这可能是一个非常愚蠢的问题。
enum
常量名称在程序编译之后是未知的。要获取名称,可以创建一个数组,以便进行反向查找。例子:
enum foo {
Apple,
Banana,
Orange
};
const char* revfoo[]{ "Apple", "Banana", "Orange" };
std::cout << revfoo[Apple] << 'n'; // Prints "Apple"
注意:这适用于从0开始且没有间隔的枚举。如果枚举不是从零开始的,或者有空格,可以使用unordered_map
。
#include <string>
#include <unordered_map>
std::unordered_map<foo, std::string> revfoo {
{Apple, "Apple"},
{Banana, "Banana"},
{Orange, "Orange"}
};
std::cout << revfoo[Apple] << 'n'; // Prints "Apple"
#include <iostream>
#include <string>
std::string number_to_String(foo number)
{
switch(number)
{
case Apple:
return "Apple";
case Banana:
return "Banana";
case Orange:
return "Orange";
default:
return "No data Found";
}
}
int main() {
std::cout << number_to_String(Apple);
return 0;
}
如果你愿意,你可以这样做。
可以将int类型强制转换为enum类型,但必须注意int类型是有效的enum值:
#include <iostream>
const int value_to_convert = 0; // For example
const foo converted_val = static_cast<foo>(value_to_convert);
std::cout << "Value: " << converted_val << std::endl;
上面的输出值依赖于一个重载的输出流操作符:
#include <ostream>
std::ostream &operator<<(std::ostream &os, const foo &f)
{
switch (f)
{
case foo::Apple:
os << "Apple";
break;
// etc...
}
return os;
}
假设枚举的索引为零,可以在末尾添加一个元素来表示元素的数量,并在进行强制类型转换之前使用它来检查整数是否有效。但是,这会污染枚举,并且(在我看来)有点乱:
#include <optional>
enum foo
{
Apple,
Banana,
Orange,
NUM_ELEMENTS
}
std::optional<foo> convert_foo(const int val)
{
if ((val < 0) || (val >= NUM_ELEMENTS))
{
return std::nullopt;
}
else
{
return static_cast<foo>(val);
}
}
注意,使用optional需要c++ 17或更高版本。
正如你所看到的,不幸的是,c++目前还没有提供一个好的、清晰的方式来实现你想要的。