(如何)我可以计算枚举中的项目?

当我有类似的东西的时候,这个问题出现在我的脑海里

enum Folders {FA, FB, FC}; 

并想为每个文件夹创build一个容器数组:

 ContainerClass*m_containers[3]; .... m_containers[FA] = ...; // etc. 

(使用地图使用更优雅: std::map<Folders, ContainerClass*> m_containers;

但是要回到我原来的问题:如果我不想硬编码数组大小,有什么方法可以找出文件夹中有多less项? (不依赖于例如FC是列表中的最后一项,如果我没有弄错的话,将允许像ContainerClass*m_containers[FC+1]这样的东西)。

有没有一个很好的方法来做到这一点,通常你会看到枚举中的一个额外的项目,即

 enum foobar {foo, bar, baz, quz, FOOBAR_NR_ITEMS}; 

那么你可以这样做:

 int fuz[FOOBAR_NR_ITEMS]; 

尽pipe如此,仍然不是很好。

但是你当然知道,只是枚举中的项目数是不安全的,例如

 enum foobar {foo, bar = 5, baz, quz = 20}; 

项目的数量将是4,但是枚举值的整数值将超出数组索引范围。 使用枚举值进行数组索引是不安全的,您应该考虑其他选项。

编辑:根据要求,使特别的条目更突出。

对于C ++,有各种types安全的枚举技术可供使用,其中一些(例如提议但从未提交的Boost.Enum )包括支持获取枚举的大小。

最简单的方法,在C和C ++中工作,是采用为每个枚举types声明… MAX值的约定:

 enum Folders { FA, FB, FC, Folders_MAX = FC }; ContainerClass *m_containers[Folders_MAX + 1]; .... m_containers[FA] = ...; // etc. 

编辑 :关于{ FA, FB, FC, Folders_MAX = FC}{FA, FB, FC, Folders_MAX] :我倾向于将… MAX值设置为enum的最后合法值,原因如下:

  1. 常量的名称在技术上更准确(因为Folders_MAX给出了最大可能的枚举值)。
  2. 就个人而言,我觉得Folders_MAX = FC从其他条目中脱颖而出(使得在没有更新最大值的情况下无意中添加枚举值有点困难,Martin York引用了一个问题)。
  3. GCC包含诸如“枚举值不包含在开关中”等有用的警告,用于以下代码。 让Folders_MAX == FC + 1打破了这些警告,因为你最终会得到一堆…… MAX枚举值,这些值永远不应该包含在开关中。
开关(文件夹) 
 {
  案例FA:...;
  案例FB:...;
   //哎呀,忘了FC!
 }

如何在STL时尚的特质? 例如:

 enum Foo { Bar, Baz }; 

写一个

 std::numeric_limits<enum Foo>::max() 

专业化(可能constexpr如果你使用C + + 11)。 然后,在您的testing代码中提供任何静态断言来维护std :: numeric_limits :: max()= last_item的约束。

在枚举的最后添加一个名为Folders_MAX或类似物的条目,并在初始化数组时使用此值。

 ContainerClass* m_containers[Folders_MAX]; 

我真的没有办法真正得到在C ++枚举值的数量。 前面提到的解决scheme中的任何一个都可以工作,只要你没有定义你的枚举的值,如果你定义了你的价值,你可能会遇到你创build的数组太大或太小

 enum example{ test1 = -2, test2 = -1, test3 = 0, test4 = 1, test5 = 2 } 

在这个例子中,当你需要一个5个数组的数组时,结果会创build一个3个数组的数组

 enum example2{ test1 , test2 , test3 , test4 , test5 = 301 } 

在这个例子中,当你需要一个5个数组的数组的时候,结果会创build一个301个数组的数组

在一般情况下解决这个问题的最好方法是迭代你的枚举,但是这还不是标准的,就我所知

我喜欢使用枚举作为我的函数的参数。 提供一个固定的“选项”列表是一个简单的方法。 在这里顶部的投票答案的麻烦是,使用它,客户端可以指定一个“无效的选项”。 作为一个分离,我build议做基本相同的事情,但在枚举之外使用一个常量int来定义它们的计数。

 enum foobar { foo, bar, baz, quz }; const int FOOBAR_NR_ITEMS=4; 

这不是一件愉快的事情,但是如果你不更改常量就不改变枚举,这是一个干净的解决scheme。