C++17:仍然使用枚举作为常量
C++17: still using enums as constants?
我习惯于使用enum
作为常量 - 它们编写速度很快,可以放在.h文件中,并且可以正常工作。
enum {BOX_LEFT=10, BOX_TOP=50, BOX_WIDTH=100, BOX_HEIGHT=50};
enum {REASONS_I_LIKE_ENUM_AS_CONSTANTS = 3};
这不再是一个好主意了吗?
我认为有充分的理由更喜欢枚举类(传统的枚举隐式转换为 int;传统的枚举将它们的枚举器导出到周围的范围),但在这种情况下,这些都是首选旧枚举的理由。
我在静态 constexprint 与老式枚举的线程中看到,旧式枚举更好,因为对于静态 constexpr 成员,您还必须在类外声明它。 但这显然在C++17中不再适用,无论如何可能只适用于班级成员。
c++17 中的首选方法是什么?
这是主观的。
然而,这始终是对枚举的滥用。你没有列举任何东西;您只是窃取enum
功能,以获取一些与任意整数值无关的功能,这些值不打算具有自己的逻辑"类型"。
这就是为什么enum class
在这里也不合适(因为,正如你所指出的,enum class
强制执行应该存在但你实际上并不想要的enum
的属性)。
由于static constexpr int
不再有任何问题,我会使用它(或constexpr inline int
,或者本周的任何东西)。
您给出的用于使用 enum
的示例可以重写为:
struct Point
{
int x;
int y;
};
struct Box
{
Point p;
int width;
int height;
};
constexpr Box b = { { 1, 2 }, 3, 4 };
int f()
{
return b.p.x;
}
使用强类型而不是int
甚至可能是一个好处。
对我来说,这更清晰。我甚至可以在其中添加一些功能。
相关文章:
- 类似枚举的计算常量
- 相同的枚举项在 SWIG > 2.0.1 中包装在不同类型的常量中
- 大括号使用枚举类初始化静态常量unordered_map
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- C++17:仍然使用枚举作为常量
- 枚举常量在C和C++中表现不同
- 为什么枚举值的initializer_list不被视为常量表达式
- 将C++枚举映射为常量字符*
- 有没有办法不警告 gcc 中开关缺少"COUNT"枚举常量?
- 枚举数组相对于常量和宏的优势
- 使用结构中定义的枚举作为C++中的大小写常量
- 循环通过常量枚举#define
- 枚举与静态常量
- 使C++软件包和C#软件包访问相同枚举/常量int的最佳方法
- 如何识别int代码值属于枚举中的哪个常量
- integer常量太大,以至于在为枚举分配最大类型值时它是无符号的
- 枚举用于多个文件,或多个文件的自动唯一常量
- 检测单个枚举常量的类型
- std::min未能将枚举常量解释为有效的整数类型(g++4.6.3)
- 是否可以将指向类的指针用作枚举常量?