4

我创建了一个枚举名称颜色。然后制作了一个颜色类型的变量background_color。然后分配一个枚举值,假设为蓝色。然后我想background_colorcout. 但它会打印枚举成员的相应 int 值。我想知道是否有任何操纵器会将其打印background_color为字符串。我知道我可以使用开关盒来做到这一点。但我希望我能使用cout和操纵器获得这个。

#include <iostream>
using namespace std;
int main()
{
    enum color
    {
        red,blue,black
    };

    color background_color=blue;
    cout << background_color;

    return 0;
}

我希望打印蓝色作为输出而不是 1.A

4

3 回答 3

2

不,没有,但您可以使用 astd::map来保存您的颜色和它们的名称。

#include <iostream>
#include <map>
#include <string>

enum color { red, blue, black };

std::map<color, std::string> color_names{ { red, "red"}, { blue, "blue"}, { black, "black"} };

int main()
{
    std::cout << "my favorite color is " << color_names[red] << '\n';
}
于 2019-06-06T04:45:51.067 回答
1

您可以创建一个执行此操作的宏。

#define ENUM_TO_STRING(var) (#var)

然后,当你想使用它时,

enum Test
{
   Test_A,
   Test_B
}

int main()
{
    std::cout << ENUM_TO_STRING(Test_A) << std::endl;
    return 1;
}

不过,这不适用于存储在变量中的枚举。

于 2019-06-06T06:41:36.370 回答
1

我想知道是否有任何操纵器将 background_color 打印为字符串。

一个简单的答案:据我所知,没有机械手可以直接为您执行此操作。但是,有很多工具和方法可以实现您想要的。有人已经建议使用std::map. 这是一种有效的可能方式,还有许多其他方式各有优缺点。平衡差异取决于您。

我没有使用,而是std::map选择使用static const std::array. 我还决定将枚举放在一个包含构造函数和两个变量的结构中。它的类型及其名称的字符串。然后我创建了一个重载operator<<()来处理我的结构以获得它的输出。


这是我的代码的样子:

测试.h

#include <array>
#inlucde <iostream>
#include <string>

// must match the size and order of 
// the enumeration in the Color Struct
static const std::array<std::string, 8> name {
    "Black",
    "Red",
    "Orange",
    "Yellow",
    "Green",
    "Blue",
    "White",
    "Invalid"
};

struct Color {
    enum Type {
        BLACK,
        RED,
        ORANGE,
        YELLOW,
        GREEN,
        BLUE,
        WHITE,
        INVALID,
    } type_;

    std::string name_;

    explicit Color(Color::Type ty = INVALID) : type_(ty), name_(name[ty] ) {}

};

std::ostream& operator<<(std::ostream& os, const Color& color );

测试.cpp

#include "Test.h"

std::ostream& operator<<(std::ostream& os, const Color& color) {
    return os << color.name_;
}

主文件

#include "Test.h"

int main() {
    Color blank;
    Color red(Color::RED);
    Color white(Color::WHITE);
    Color blue(Color::BLUE);

    std::cout << blank << " "
              << red << " "
              << white << " "
              << blue << '\n';

    return EXIT_SUCCESS;
}

输出

Invalid Red White Blue

我选择数组而不是地图,因为它具有更快的访问时间。此外,我选择将其设为 const static,这样它只需初始化一次!这些是我方法的优点。

缺点是数组是常量,不能修改,不能插入数组。但是,因为我们正在处理枚举,所以这应该不是问题,因为在声明它是整数类型而不是容器之后,您不能添加到枚举中。

此方法的另一个优点是您不必担心使用 switch 语句。这里唯一的缺点是两个变量的存储空间,一个枚举类型和一个字符串,但这不会对内存占用产生很大影响,除非您存储数百万或数十亿种颜色。

当您知道您的应用程序将支持有限或指定数量的对象时,上面的设计结构非常适合。即使您声明了 100 种预定义颜色,这种方法仍然可以管理。

另一方面,如果您要存储数千或数万种不同的颜色,那么 std::map 可能更有意义。在这种情况下,您可以声明 astatic map<unsigned, string>并将其移动到类中,然后有一个静态函数将使用您将支持的每种不同对象类型的所有字符串名称初始化映射。

于 2019-06-06T06:51:08.857 回答