C++17:仍然使用枚举作为常量

C++17: still using enums as constants?

本文关键字:枚举 常量 C++17      更新时间:2023-10-16

我习惯于使用enum作为常量 - 它们编写速度很快,可以放在.h文件中,并且可以正常工作。

enum {BOX_LEFT=10, BOX_TOP=50, BOX_WIDTH=100, BOX_HEIGHT=50};
enum {REASONS_I_LIKE_ENUM_AS_CONSTANTS = 3};

这不再是一个好主意了吗?

我认为有充分的理由更喜欢枚举类(传统的枚举隐

式转换为 int;传统的枚举将它们的枚举器导出到周围的范围),但在这种情况下,这些都是首选旧枚举的理由。

我在静态 constexpr

int 与老式枚举的线程中看到,旧式枚举更好,因为对于静态 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甚至可能是一个好处。

对我来说,这更清晰。我甚至可以在其中添加一些功能。