【问题标题】:C++17: still using enums as constants? [duplicate]C++17:仍然使用枚举作为常量? [复制]
【发布时间】:2019-01-31 17:11:16
【问题描述】:

我习惯于使用enum 作为常量——它们写起来很快,可以放在 .h 文件中,而且工作正常。

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

这不再是个好主意吗?

我认为 reasons 更喜欢 enum 类(传统枚举隐式转换为 int;传统枚举将其枚举数导出到周围范围)很好,但在这种情况下,这些是更喜欢旧枚举的原因。

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

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

【问题讨论】:

  • 不确定如何最好地处理这个问题。我在这里接受了一个答案。我同意这些问题是相同的。这个稍早一些(2 小时!),回答稍早一些(1 小时!)。但我也喜欢另一个线程上的获胜答案,也许更好,因为它澄清了static
  • 是的,不确定。我实际上在这里写了相同的答案,版主删除了我的答案,声称如果答案相同,我应该将问题标记为重复,所以我这样做了。另请参阅我(已删除)答案中的其他链接问题:Should const and constexpr variables in headers be inline to prevent ODR violations?
  • 我刚刚点击了“这解决了我的问题!”它说这会将用户引导到另一个页面,并在此处阻止新的答案,这很好。

标签: c++ enums c++17


【解决方案1】:

这是主观的。

但是,这始终是对枚举的滥用。你没有枚举任何东西;你只是在窃取enum 功能来获取一些与任意整数值无关的值,这些值并不打算拥有自己的逻辑“类型”。

这就是为什么enum class 在这里也不合适(因为,正如您所指出的,enum class 强制 enum 的属性 应该在那里但你实际上并不想要)。

既然static constexpr int 不再有任何问题,我会使用它(或constexpr inline int,或者本周的任何内容)。

【讨论】:

  • 我会使用 constexpr inline,但也许这只是我 :)
  • 不管你明白了什么:P
  • 功能滥用?在 C++ 中!? :O
  • constexpr inline const static register int.
  • 在交易中添加volatile
【解决方案2】:

你给出的使用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 甚至可能是一个好处。

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

【讨论】:

猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 2019-12-02
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多