我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
How should we use an enum class for indexing (or should we better avoid this)?
假设我们有一个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
};
}
那么 to int 转换是隐式的,并且不会污染包含的命名空间。
这里的解决方案非常接近 0 开销,允许您使用枚举(并且仅枚举(作为[]
键。
所以你得到:
enum_array<foo, T> arr;
arr
的行为就像你想要的那样。
作为部分解决方案,您可以定义
constexpr std::underlying_type_t<foo> operator*(foo f) {
return static_cast<std::underlying_type_t<foo>>(f);
}
然后写
int bar(std::array<int, *foo::count>& arr) {
return arr[*foo::b];
}
演示
相关文章:
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?
- 我们可以在不使用head指针的情况下通过使用head的简单变量而不是head的指针来实现链表吗
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 我们不能在不使用指向对象的指针的情况下创建节点C++吗?
- 为什么我们可以访问交换机其他情况下标签内的变量
- 在无法完成 RVO 的情况下,我们应该写"std::move"吗?
- 我们可以在没有安装工具包的情况下运行CUDA加速程序
- 我们可以在不使用任何控制结构的情况下从函数中返回基于决策的值
- 我们可以在不使用构造函数的情况下推回包含矢量的结构
- 为什么我们应该为initializer_list的情况过多载荷转发构造函数
- c++:为什么在switch的情况下我们可以声明一个变量
- C++我们如何在不使用友元函数的情况下通过对象调用私有函数
- 在这种情况下,我们在C中的枚举中只定义一个成员
- 在C++中,我们不能在没有初始化的情况下声明引用。为什么?
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 如果我们在需要整数的开关情况下输入字符会发生什么
- 在什么情况下我们需要包括<cassert>?
- 如何在没有蛮力的情况下找到矩阵中元素的计数?我们能做到吗?