在c++ 11中不使用宏是否可以对枚举值进行字符串化?

Is it possible to stringify enum values in C++11 without macros?

本文关键字:枚举 字符串 c++ 是否      更新时间:2023-10-16

我知道可以编写一个"register"宏,将它们的值映射到它们的字符串表示形式。然而,c++ 11中是否有一些新的神奇之处,使得没有宏和任何注册模板成为可能?

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

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

应该输出

Days::Sunday

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

如果你真的需要,一个可能更简单的方法是生成一些(c++)代码,这几乎就是宏为你所做的。Qt Moc可能会给你带来灵感。

No。没有宏是不行的

如前所述是不可能的。但是可以考虑使用类作为enum。

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");
// ....

类型更强,工作方式与enum完全相同,并具有所需的其他特性。

此外,您可以添加所有您想要的方便功能,例如:

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