我对 CPP 编程非常陌生。我有一个枚举:
emun foo
{
Apple,
Banana,
Orange
}
例如 foo::Banana
正在打印 1
,但如果我有 1
,如何将 Banana
打印到输出?这可能是一个非常愚蠢的问题。
答案 0 :(得分:2)
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"
答案 1 :(得分:1)
#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;
}
如果你愿意,你可以这样做。
答案 2 :(得分:0)
您可以将 int 转换为枚举,但必须注意 int 是有效的枚举值:
#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++ 目前还没有提供一种很好、清晰的方式来实现您的愿望。