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 次 |
最近记录: |