【问题标题】:Why is there no enumeration concept in C++ 20?为什么 C++ 20 中没有枚举概念?
【发布时间】:2020-05-18 17:08:47
【问题描述】:

我正在尝试使用当前的 GCC10 将一些旧代码更新为即将到来的 C++20 语言。

我无法更新某些模板,因为它们使用了 std::enable_if<std::is_enum_v<T>> 条件,并且在 C++20 中没有定义 std::enumeration 概念。

当然我可以定义自己的概念,但我仍然想知道为什么 C++20 没有将所有现有的类型特征都实现为概念。

这是为什么?我错过了什么重要的事情吗?

【问题讨论】:

  • 为什么需要有枚举的概念?
  • @Barry 因为它很方便。
  • @Cortex 它提供了哪些便利?稍微矮一点?
  • @Barry 好吧,显然很多概念都是“不必要的”,但我认为它的语法更简洁。模板 <:enumeration e> 与模板 >。当然这只是我的意见。
  • @Cortex 这是一个错误的选择,你可以写&lt;typename E&gt; requires std::is_enum_v&lt;E&gt;

标签: c++ typetraits c++-standard-library c++20 c++-concepts


【解决方案1】:

没有enumeration 概念,因为从来没有一个特定的意图来创建一个匹配每个类型特征的概念。甚至大部分。

C++20 概念库或多或少基于使 Ranges 库工作所需的内容。它专注于概念擅长的事情,比如问“我能用这种类型做什么?”您可以询问是否可以默认构建T 或复制/移动一个,等等。您不是在限制类型是什么,而是限制您将如何使用它。

enumeration 这样的概念并不是一个非常有用的约束。请记住:从逻辑的角度来看,如果模板约束了一个参数,那么它应该只使用符合该约束的参数。因此,如果您有一个采用默认可构造T 的函数,那么该函数在默认构造一个时应该只使用T(尽管在语法上没有阻止您违反它,但它通常被认为是不良形式)。

要成为 integralfloating_point 要求类型是这些基本类型之一,这会带来这些类型提供的所有表现力。

但是你可以用enumeration 单独做什么呢?您可以默认构造一个(尽管这是否代表一个合法的枚举值并不明显,所以不清楚你会用它做什么),你可以分配和比较它(尽管即使比较也可以重载/@ 987654329@d),你可以用它的底层类型来玩游戏。但仅此而已。

如果某些T 是一个枚举,那并不意味着T 有任何特定的枚举字段。因此,如果您的约束仅仅是它是一个枚举,那么您就失去了枚举的主要特征。

这并不意味着它不会出现。但仅仅因为一个约束偶尔出现并不意味着它上升到一个概念的水平。

【讨论】:

  • 好的,我明白你的意思了。就我而言,我点击了一些访问自定义枚举 RTTI 框架的模板。这实际上要求使用的类型是枚举。我不认为我可以重新调整这个更像概念。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多