fue*_*zig 91 c++ enumeration count
当我有类似的东西时,我想到了这个问题
enum Folders {FA, FB, FC};
Run Code Online (Sandbox Code Playgroud)
并希望为每个文件夹创建一个容器数组:
ContainerClass*m_containers[3];
....
m_containers[FA] = ...; // etc.
Run Code Online (Sandbox Code Playgroud)
(使用的地图是更优雅的使用方法:std::map<Folders, ContainerClass*> m_containers;)
但回到我原来的问题:如果我不想对数组大小进行硬编码,有什么方法可以找出文件夹中有多少项?(不依赖于例如FC列表中的最后一项,ContainerClass*m_containers[FC+1]如果我没有弄错的话就会允许这样的事情.)
wic*_*ich 116
这并不是一个很好的方法,通常你会在枚举中看到一个额外的项目,即
enum foobar {foo, bar, baz, quz, FOOBAR_NR_ITEMS};
Run Code Online (Sandbox Code Playgroud)
那么你可以这样做:
int fuz[FOOBAR_NR_ITEMS];
Run Code Online (Sandbox Code Playgroud)
虽然还不是很好.
但是当然你会意识到只有enum中的项目数量是不安全的,例如
enum foobar {foo, bar = 5, baz, quz = 20};
Run Code Online (Sandbox Code Playgroud)
项目数量为4,但枚举值的整数值将超出数组索引范围.使用枚举值进行数组索引并不安全,您应该考虑其他选项.
编辑:根据要求,使特殊条目更加突出.
Jos*_*ley 32
对于C++,有各种类型安全的枚举技术可用,其中一些(例如建议但从未提交过的Boost.Enum)包括对获取枚举大小的支持.
在C和C++中最简单的方法是采用为每个枚举类型声明... MAX值的约定:
enum Folders { FA, FB, FC, Folders_MAX = FC };
ContainerClass *m_containers[Folders_MAX + 1];
....
m_containers[FA] = ...; // etc.
Run Code Online (Sandbox Code Playgroud)
编辑:关于{ FA, FB, FC, Folders_MAX = FC}与{FA, FB, FC, Folders_MAX]:我喜欢... MAX值设置为枚举几个原因的最后一个合法值:
Folders_MAX给出了最大可能的枚举值).Folders_MAX = FC从其他条目中脱颖而出(使得在不更新最大值的情况下意外添加枚举值有点困难,这是Martin York引用的问题).
switch (folder)
{
case FA: ...;
case FB: ...;
// Oops, forgot FC!
}
STL时尚的特质怎么样?例如:
enum Foo
{
Bar,
Baz
};
Run Code Online (Sandbox Code Playgroud)
写一个
std::numeric_limits<enum Foo>::max()
Run Code Online (Sandbox Code Playgroud)
专业化(如果你使用c ++ 11,可能是constexpr).然后,在您的测试代码中提供任何静态断言来维护std :: numeric_limits :: max()= last_item的约束.
| 归档时间: |
|
| 查看次数: |
103387 次 |
| 最近记录: |