如果遍历枚举?
可能很多人认为遍历枚举没有什么意义,但有时候遍历枚举值还是有实际意义的:举例如下:
_variant_t的类型值vt是个VARENUM枚举,微软在实现_variant_t的拷贝构造函数的时候,会检查_variant_t的类型是否是VARENUM中的值,如果不是,会直接错误(非ASSERT)。当我们从_variant_t派生新类的时候,在写新类的拷贝构造函数时(假设新类名为NEW_VARIANT),常规的写法如下:
NEW_VARIANT::NEW_VARIANT(const NEW_VARIANT &vSrc) : _variant_t(vSrc)
{
// ...
}
如果我们在新类中,扩展了vt的取值范围,那么在调用_variant_t(vSrc)的时候,程序直接就崩溃了,所以需要把_variant_t(vSrc)放到拷贝构造函数内执行,如下:
NEW_VARIANT::NEW_VARIANT(const NEW_VARIANT &vSrc)
{
if (vt == VARENUM中的值)
{
执行_variant_t(vSrc)中的代码。
}
else
{
对新类中新增加的变量做拷贝构造。
}
}
现在的问题是:VARENUM的是很大的枚举。上面的构造函数中,if语句和每个枚举值进行都要进行比较,写起来就比较麻烦,用switch语句,稍微简单一点,但同样不利于书写和阅读。如果哪天微软扩充或修改了这个枚举的定义,那么我们的代码同样需要修改。
所以,我想问的是,有没有直接遍历枚举值的方法?来简化上面编程?
[解决办法]
是否扩展了枚举的值范围,应该让调用者负责吧。
[解决办法]
把概念分清了!
“遍历”一般指对于“集合”或“容器”之操作,也就是具有多个“元素”的结构;
而你所举例子只有一个元素变量(不要把元素的“取值范围、不同取值”与“多个元素”搞混了),何来“遍历”?
[解决办法]
枚举用有意义的字符定义,然后用switch来处理,也只能这样了。
[解决办法]
EMNU NUMBER
{
NUMBER0 = 0,
NUMBER1,
NUMBER2,
NUMBER3,
NUMBERMAX
}
NUMBER cuNumber;
for(cuNumber= NUMBER0;cuType < NUMBERMAX;cuType ++)
{
//dosomething.............
}
既然使用了C++,那么软件的结构设计就不能以其他语言特性的概念作为依赖。
[解决办法]
定义一个数组与枚举相对应即可
枚举是不能直接遍历的
[解决办法]
手动遍历。就算你能用一个循环去遍历,你也没有通用的办法去统一处理吧。
[解决办法]
我也有经历过需要遍历枚举的情况,现在想不起来了。在C++里没有原生的遍历枚举的方法,无奈啊。