是否有操纵器将枚举值打印为字符串?

时间:2019-06-06 04:32:22

标签: c++ enums cout manipulators

我创建了一个枚举名称颜色。然后创建一个颜色为background_color的变量。然后分配一个枚举值,假设为蓝色。然后,我想使用background_color打印cout。但是它将打印枚举成员的相应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

3 个答案:

答案 0 :(得分:2)

没有,但是您可以使用scala> var df2=df.groupBy("col1").agg(collect_list("col2").alias("col2")) df2: org.apache.spark.sql.DataFrame = [col1: int, col2: array<string>] scala> df2.show +----+---------+ |col1| col2| +----+---------+ | 1|[a, b, c]| | 2|[b, b, c]| +----+---------+ 来保存您的颜色及其名称。

std::map

答案 1 :(得分: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;
}

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

答案 2 :(得分:1)

  

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

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

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


这是我的代码:

Test.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 );

Test.cpp

#include "Test.h"

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

main.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可能更有意义。在这种情况下,您可以声明static map<unsigned, string>并将其移到类内,然后使用一个静态函数,该函数将使用将支持的每种不同对象类型的所有字符串名称来初始化映射。