【发布时间】:2020-01-07 20:17:30
【问题描述】:
假设我们有一个enum 类型foo,我们想用它来索引一个静态大小的数组arr。
如果我们想为此使用enum class,我们可以这样尝试:
enum class foo
{
a,
b,
c,
count
};
std::array<T, static_cast<int>(foo::count)> arr;
但是,count 字段是一个 hack。能不能更优雅的获取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 的含义。
我们可以做得更好吗?
【问题讨论】:
-
真的很糟糕吗?如果您想使用枚举作为索引,为什么不使用普通的旧
enum?enum class主要效果是你需要一个演员,如果你不想要你就不必 -
使用以枚举为键类型的map/unoredered_map?
-
@NathanOliver 当然,但这不会以查找每个数组访问而告终吗?好像不值这个价。
-
@0xbad 查找将是带有 unordered_map 的 on average O(1)。尤其是如果您的枚举只有 3 个项目,就像示例一样,即使是 O(n) 解决方案也可能不会产生合理的差异。也许您可以告诉我们更多关于您正在尝试做的事情,这使得该操作的运行时如此重要?
-
@scohe001 为什么我要增加开销(即使它具有恒定的复杂性)只是为了比普通的
enum获得这么一点好处?
标签: c++ indexing enums c++17 enum-class