我正在处理遗留代码库,其中头文件定义了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,
将从[近]零成本
保证有人无法致电func("hello world")
允许我获取枚举
您想提及的其他任何有用的内容
答案 0 :(得分:1)
有没有办法将这些字符串抛出一个类型,比如string_enum,
- 将从零成本
中获取正确的字符串 醇>
不是真正的零成本,但效率很高:使用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 }
};
- 保证有人不能打电话给func(&#34; hello world&#34;)
醇>
检查地图键中是否存在字符串,如果不存在,则从func()
中抛出异常:
void func(const std::string key) {
if(enumMap.find(key) == std::end(enumMap)) {
throw std::invalid_argument("key");
}
}
- 允许我获取枚举
中的元素数量 醇>
std::size_t getNumKeys() {
return enumMap.size();
}