如何从索引打印枚举值?

时间:2021-03-05 08:03:45

标签: c++ enums

我对 CPP 编程非常陌生。我有一个枚举:

emun foo
{
    Apple,
    Banana,
    Orange
}

例如 foo::Banana 正在打印 1,但如果我有 1,如何将 Banana 打印到输出?这可能是一个非常愚蠢的问题。

3 个答案:

答案 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++ 目前还没有提供一种很好、清晰的方式来实现您的愿望。