当前位置: 首页 > 知识库问答 >
问题:

是否有任何操纵器将枚举值打印为字符串?[副本]

常小白
2023-03-14

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

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

    color background_color=blue;
    cout << background_color;

    return 0;
}

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

共有3个答案

白昊东
2023-03-14

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

一个简单的答案:据我所知,没有一个操纵器可以直接为您执行此操作。然而,有很多工具和方法可以实现你想要的。有人已经建议使用std::map。这是一种有效的可行方法,其他许多方法各有利弊。这取决于你来平衡这些差异。

我没有使用std::map而是选择使用static const std::array。我还决定将枚举放在包含构造函数和两个变量的结构中。它所属的类型及其名称的字符串。然后我创建了一个重载的操作符

下面是我的代码的样子:

测验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_;
}

主要的cpp

#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,这样它只需初始化一次!这些是我的方法的优点。

缺点是数组是const,不能修改,也不能插入数组。但是,由于我们要处理的是枚举,这不应该是一个问题,因为在枚举被声明后,您不能添加到枚举,因为它是一个整体类型,而不是容器。

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

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

另一方面,如果要存储数千或上万种不同的颜色,那么std::map可能更有意义。在这种情况下,您可以声明一个静态映射

羊舌勇
2023-03-14

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

#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;
}

但这对存储在变量中的枚举不起作用。

能向晨
2023-03-14

没有,但是您可以使用std::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';
}
 类似资料:
  • 我在php中有一个布尔值。当我做以下事情时: 我得到类似于或的东西。有没有简单的方法来获得或

  • “String”类型的参数不能分配给“Types”类型的参数。

  • 问题内容: 我觉得这是一个简单的问题,但是我尝试过的所有事情都不适合我。我有一个枚举,我有字符串构造函数的原因是因为Java不允许枚举为数字..我在没有字符串构造函数的情况下直接尝试了AA,AB,2C,但这给出了错误。请注意,对于现有的枚举,我要添加C(“ 2C”)。 现在我有一个mybatis映射器,它会进行合并,这是现有的,并且映射器的参数之一是TestEnum。到目前为止,由于枚举值和字符串

  • 本文向大家介绍Java将枚举转换为字符串,包括了Java将枚举转换为字符串的使用技巧和注意事项,需要的朋友参考一下 示例 有时您想将枚举转换为String,有两种方法可以实现。 假设我们有: 那么,我们如何将类似的东西转换Fruit.APPLE为"APPLE"? 使用转换 name() name()是一个内部方法,enum该方法返回String枚举的表示形式,返回值精确String表示枚举值的定义

  • 问题内容: 我知道该信息在枚举中可用。 如何打印所有枚举值,如:? 输出: 姓名 教育 电子邮件 电话 如何在另一个函数中将该枚举作为arg 传递? 问题答案: 您的第二部分…与或一样

  • 是否有一种方法可以将所有枚举显示为swagger中的字符串值,而不是int值? 我希望能够提交POST操作并根据它们的字符串值放置枚举,而不必每次都查看枚举。 我尝试了,但服务器随后接收字符串而不是我们正在寻找的枚举值。 有人解决过这个吗? 编辑: