是否可以在没有宏的情况下在C ++ 11中对枚举值进行字符串化?

时间:2011-11-18 16:48:15

标签: c++ c++11

我知道可以编写一个“寄存器”宏,将其值映射到字符串表示形式。然而,在C ++ 11中是否有一些新的魔力可以在没有宏和任何注册样板的情况下完成?

为清楚起见,我希望能够打印枚举变量的标识符,例如:

enum Days { Sunday, Monday, Tuesday };
auto d = Days::Sunday;
std::cout << magic << d;

应输出

Days::Sunday

3 个答案:

答案 0 :(得分:8)

不,这不太可能。您需要宏(最好)或扩展编译器以获得额外的技巧(您可以使用插件或MELT扩展GCC以提供特殊的_my_enum_name_builtin功能,但我认为这不是一个好主意)。您还可以(假设可执行文件是使用保留的调试信息构建的)从调试信息中提取名称。

如果你真的需要它,一个更简单的方法就是生成一些(C ++)代码,这几乎就是宏为你做的事情。 Qt Moc可能是你的灵感。

答案 1 :(得分:2)

没有。没有宏就不可能。

答案 2 :(得分:0)

如前所述,是不可能的。但是您可以考虑将类用作枚举。

class Day
{
   enum _Day{ Sunday, Monday, Tuesday, Wensday, Thursday, Friday, Saturday }

public:
    static Day Sun;
    static Day Mon;
    static Day Tue;
    static Day Wen;
    static Day Thu;
    static Day Fri;
    static Day Sat;

    operator    int() const     { return _day; }

    int         toInt() const   { return _day; }
    std::string toStr() const   { return _name;}

private:
    Day(_Day day, std::string name) 
        : _day(day), _name(std::move(name))
    {
    }

  _Day _day;
  std::string _name;
};

Day Day::Mon = Day(_Day::Sun, "Sunday");
Day Day::Mon = Day(_Day::Mon, "Monday");

// ....

更强的键入功能与枚举完全一样,具有您需要的其他功能。

此外,您可以添加所需的所有便利功能,例如:

operator std::string() const;
bool operator==(const Day&);
Day& operator=(const Day&);