多个输出运算符?

cai*_*rol 4 c++ enums operator-overloading operators

是否可以为枚举定义多个输出运算符?我想用这个

std::ostream& operator<< (std::ostream& os, my_enum e);
Run Code Online (Sandbox Code Playgroud)

操作员 (1) 打印人类可读的文本并 (2) 将其转换为一些代码以存储在数据库中。

谢谢

may*_*eye 5

创建将返回一些对象而不是 ostream& 的包装器,它将处理打印。在您的情况下,它将反对打印人类可读的值和打印数据库代码的对象。这是打印人类可读形式和整数形式的粗略示例。ostream_enum_wrapper_human带有运算符 << 的类用于打印人类可读的形式,ostream_enum_wrapper_int带有 << 的类用于打印整数代码。要从 ostream& 切换到包装器,使用运算符 << (ostream&, wrappertag),它将 ostream 对象包装在包装器内部并返回包装的对象。所以下一个 << 操作符是在包装器对象上调用的,而不是在 ostream& 上调用,并且包装器类知道如何打印值。

#include <iostream>
using namespace std;
class ostream_enum_wrapper_human
{
    public:
    ostream& out;
    ostream_enum_wrapper_human(std::ostream& _out) : out(_out){}

};

class ostream_enum_wrapper_int
{
    public:
    std::ostream& out;
    ostream_enum_wrapper_int(std::ostream& _out) : out(_out){}
};


enum T{zero,one,two};

struct human_readable{} HumanReadable;
ostream_enum_wrapper_human operator << (ostream& out, human_readable){
    return ostream_enum_wrapper_human(out);
}

struct print_int{} PrintInt;
ostream_enum_wrapper_int operator << (ostream& out, print_int){
    return ostream_enum_wrapper_int(out);
}


ostream& operator << (ostream_enum_wrapper_human out, T t)
{
    switch(t) {
        case zero: out.out << "zero"; break;
        case one: out.out << "one"; break;
        case two: out.out << "two"; break;
    }

    return out.out;
}

ostream& operator << (ostream_enum_wrapper_int out, T t)
{
    return out.out << static_cast<int>(t);
}

int main()
{
    cout << HumanReadable << zero << PrintInt << zero << HumanReadable << two;
}
Run Code Online (Sandbox Code Playgroud)

打印 zero0two