C ++将多个字符串更改为枚举

时间:2017-11-06 22:24:25

标签: c++ string boost types enums

我正在处理遗留代码库,其中头文件定义了5个字符串,如下所示:

#define NUM_STRINGS 5
extern string string_0;
extern string string_1;
extern string string_2;
extern string string_3;
extern string string_4;

并在其他地方的cpp文件中:

string string_0 = make_string("my_string_0");
string string_1 = make_string("my_string_1");
string string_2 = make_string("my_string_2");
string string_3 = make_string("my_string_3");
string string_4 = make_string("my_string_4");

现在在代码库中这些字符串被用作函数参数,因为我们有一个函数void func(string str),其中str总是这5个字符串中的一个。有没有办法将这些字符串抛出一个类型,比如string_enum,

  1. 将从[近]零成本

  2. 中获取正确的字符串
  3. 保证有人无法致电func("hello world")

  4. 允许我获取枚举

  5. 中的元素数量
  6. 您想提及的其他任何有用的内容

1 个答案:

答案 0 :(得分:1)

  

有没有办法将这些字符串抛出一个类型,比如string_enum,

     
      
  1. 将从零成本
  2. 中获取正确的字符串   

不是真正的零成本,但效率很高:使用std::map<std::string, my_enum>

enum my_enum {
    my_string_0 ,
    my_string_1 ,
    my_string_2 ,
    my_string_3 ,
    my_string_4
};

const std::map<std::string,my_enum> enumMap = {
    { "my_string_0" , my_string_0 } ,
    { "my_string_1" , my_string_1 } ,
    { "my_string_2" , my_string_2 } ,
    { "my_string_3" , my_string_3 } ,
    { "my_string_4" , my_string_4 }
};
  
      
  1. 保证有人不能打电话给func(&#34; hello world&#34;)
  2.   

检查地图键中是否存在字符串,如果不存在,则从func()中抛出异常:

void func(const std::string key) {
    if(enumMap.find(key) == std::end(enumMap)) {
        throw std::invalid_argument("key");
    }
}
  
      
  1. 允许我获取枚举
  2. 中的元素数量   
std::size_t getNumKeys() {
    return enumMap.size();
}