我有时会遇到这样的情况,即我有一个与其关联的字符串常量的枚举,并且在代码中的点我必须用字符串替换枚举。 e.g。
我的代码中的枚举
typedef enum {
//define weapon names
kWeaponGaussRifleType = 1,
kWeaponGatlingGunType,
kWeaponSideWinderMissileType,
kWeaponLaserType
} WeaponType;
该枚举的常用用法可能没问题。
void fireWeapon(WeaponType w) {
switch(w) {
...
}
}
可能错误地使用了我想修复的枚举。
void loadAsset(WeaponType w) {
//associate weapon filename with the weapon type
if(w == kWeaponGaussRifleType) {
fileName = "gaussRifle.png"
} elseif {
...
}
}
显然,上面的代码可以用开关替换,也可以从字符串数组中选择名称。但它仍然意味着我必须两次定义实体名称(一次在枚举中,然后在发生转换的代码中),因此在命名时容易出错和不一致。
C ++中有什么方法可以解决这个问题吗?
答案 0 :(得分:5)
是的,您可以使用X-Macros。
在头文件中,您可以定义如下内容:
#define weapons_list \
X(kWeaponGaussRifleType, 1, "gaussRifle.png") \
X(kWeaponGatlingGunType, 2. "gatlingGun.png")
然后,当您想要定义类型时:
#define X(a,b,c) a = b;
typedef enum {
weapons_list
} weaponType;
#undef X
然后你的另一个例子:
void loadAsset(WeaponType w) {
//associate weapon filename with the weapon type
#define X(a,b,c) if (w == a) { fileName = c; }
weapons_list
#undef X
}
答案 1 :(得分:1)
但它仍然意味着我必须两次定义实体名称(一次在枚举中,然后在发生转换的代码中),因此在命名时容易出错和不一致。在C ++中有什么方法可以解决这个问题吗?
C ++中没有语言功能允许您恢复枚举值的文本表示。没有办法避免重复。