使用相关字符串处理枚举的正确方法

时间:2014-04-16 08:54:10

标签: c++ enums

我有时会遇到这样的情况,即我有一个与其关联的字符串常量的枚举,并且在代码中的点我必须用字符串替换枚举。 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 ++中有什么方法可以解决这个问题吗?

2 个答案:

答案 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 ++中没有语言功能允许您恢复枚举值的文本表示。没有办法避免重复。