c++ - 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?

标签 c++ indexing enums c++17 enum-class

假设我们有一个enum类型foo我们想用它来索引数组 arr静态尺寸。

如果我们想使用enum class为此,我们可以这样尝试:

enum class foo
{
    a,
    b,
    c,
    count
};

std::array<T, static_cast<int>(foo::count)> arr;

但是,count字段是一个黑客。能否获取foo的字段个数以更优雅的方式?

无论如何,真正糟糕的是我们需要使用static_cast来访问数组。还有:arr[static_cast<int>(foo::a)] .

当然,我们可以编写一个自定义的“at”函数(请参阅 https://www.fluentcpp.com/2019/01/15/indexing-data-structures-with-c-scoped-enums/ )或提供一个“enum_array”类(请参阅 https://stackoverflow.com/a/55259936/547231 ),但这两种解决方案都有些复杂,我们最好放弃并使用简单的std::array<T, int>相反...

但是,读起来更直观 arr[foo::a]而不是arr[0] ,我们总是需要记住索引 0 的含义是什么。在后者中。

我们能做得更好吗?

最佳答案

不,不是真的。

有许多提案可以实现枚举值的静态反射。还没有使用 C++ 语言。

我的意思是你可以这样做:

namespace foo {
  enum value {
    a,b,c,count
  };
}

那么到 int 的转换是隐式的,并且不会污染所包含的 namespace 。

solution here开销非常接近 0,并且允许您使用枚举(且仅枚举)作为 [] 的键。

所以你得到:

enum_array<foo, T> arr;

arr的行为就像你想要的那样。

关于c++ - 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59635501/

相关文章:

c++ - 使用 std::copy 而不是手动 for 循环复制动态数组有什么好处?

c++ - 术语 `function declaration` 在 §7/9 (N4140) 中定义,但未定义为语法产生式。为什么?

c++ - 如何并行化这个 for 循环以快速将 YUV422 转换为 RGB888?

sql - 如何使用 MySQL 索引列?

c# - 如何检查 Enum 中是否存在来自 URL 的字符串值并将其在结果中的值分配给变量?

grails - 在grails中将枚举映射到数据库

c++ - 尽管基数为空,为什么多重继承会增加对象的大小?

r - 等效于 R 中 Excel 中的索引匹配

php - 如何审查应用程序以选择正确的索引 - php 和 mysql

c# enum equals() 与 ==