C++17:仍然可以将枚举用作常量吗?

9

我习惯使用enum作为常量 -- 它们编写快捷,可以放置在.h文件中,并且运行良好。

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

这还是一个好主意吗?

我看到了一些很好的原因来支持枚举类(普通枚举隐式转换为int; 普通枚举将它们的枚举器导出到周围范围),但在这种情况下,这些都是支持使用旧枚举的理由。

我在static constexpr int vs old-fashioned enum线程中看到,旧式枚举更好,因为使用静态constexpr成员时,您还必须在类外声明它。 但这在C++17中显然不再适用,而且可能仅适用于类成员。

c++17中的首选方式是什么?


不确定如何最好地处理这个问题。我在这里接受了一个答案。我同意这些问题是相同的。这个问题略微旧一些(2小时!),并且回答得稍微早一些(1小时!)。但是,我也喜欢另一个线程中获胜的答案,可能更好,因为它澄清了关于“静态”的问题。 - Topological Sort
是的,不确定。我实际上在这里写了相同的答案,但是一位管理员删除了我的答案,并声称如果答案相同,我应该将问题标记为重复,所以我就这样做了。还请查看我(已删除)答案中的其他链接问题:头文件中的constconstexpr变量是否应该是inline以防止ODR违规? - Acorn
1
我刚刚点击了“解决了我的问题!”它说会将用户重定向到另一个页面,并阻止在此处发布新答案,这很好。 - Topological Sort
2个回答

5

这是主观的。

然而,这一直是对枚举类型的滥用。你并没有列举任何东西;你只是利用了enum特性来获取一些与任意整数值无关的不打算拥有自己逻辑“类型”的东西。

这就是为什么在这里也不适合使用enum class(因为正如你所指出的那样,enum class强制执行了应该存在但你实际上不需要的enum属性)。

既然static constexpr int再也没有任何问题,我会使用它(或者constexpr inline int,或者本周流行的任何东西)。


3
我会使用 constexpr inline,但也许这只是我的个人偏好 :) - Rakete1111
1
好吧,无论如何你都明白我的意思 :P - Lightness Races in Orbit
8
特性滥用?在C++中!?:O - StoryTeller - Unslander Monica
3
constexpr inline const static register int 的翻译是:constexprinlineconststaticregisterint - Hatted Rooster
1
在其中加入一个 volatile 就行了! - Eljay

0

你提供的使用 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甚至可能是一种好处。

对我来说,这更易读。我甚至可以添加一些函数进去。


对于任何阅读此内容的人:可以在此处了解强类型的解释:https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/ - Topological Sort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接