在c++ 11中不使用宏是否可以对枚举值进行字符串化?
Is it possible to stringify enum values in C++11 without macros?
我知道可以编写一个"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&);
相关文章:
- 重载 std::字符串运算符+ 用于打印枚举名称
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 重载输入 (>>) 运算符以获取枚举字符串
- C++如何将字符串数组中的一个点设置为枚举变量
- 将整数值转换为以枚举为基础的字符串
- 将 Qt 属性枚举值打印为键字符串
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- 是否有任何操纵器将枚举值打印为字符串?
- C 中的枚举类型字符串类别
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 失败的证明转换字符串到枚举类
- 使用 C++11 可变参数模板初始化枚举到字符串映射
- C++将多个字符串更改为枚举
- 从字符串转换时,如何组合多个枚举
- 翻译枚举值qt的字符串表示
- 如何重载<<以输出枚举的字符串值
- 在 QML 中使用 c++ 枚举作为字符串
- 使用地图将字符串与枚举连接
- 具有字符串的类中的枚举
- 将枚举字符串(不是值)传递给宏