我知道可以编写一个“寄存器”宏,将其值映射到字符串表示形式。然而,在C ++ 11中是否有一些新的魔力可以在没有宏和任何注册样板的情况下完成?
为清楚起见,我希望能够打印枚举变量的标识符,例如:
enum Days { Sunday, Monday, Tuesday };
auto d = Days::Sunday;
std::cout << magic << d;
应输出
Days::Sunday
答案 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&);