【问题标题】:C++ change multiple strings into an enumC ++将多个字符串更改为枚举
【发布时间】:2018-04-19 04:49:08
【问题描述】:

我正在处理一个遗留代码库,其中一个头文件定义了 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. 将以 [near] 零成本从类型中获取正确的字符串

  2. 保证别人不能打电话func("hello world")

  3. 允许我获取枚举中的元素数量

  4. 还有什么你想提的有用的东西

【问题讨论】:

  • string string_0 = new string("my_string_0"); - 你不能有这样的代码 - 它不会编译。贴出真实代码。
  • 首选const unsigned int NUM_STRINGS = 5; 而不是#define NUM_STRINGS 5 并且任何时候你有编号为1 到N 的变量,你真正想要的是N 个元素的数组。
  • 不要将using namespace std 放在标题中。
  • @NeilButterworth 字符串是在一些我还没有真正找到的函数中静态构造的。新的不正确

标签: c++ string boost types enums


【解决方案1】:

有没有办法将这些字符串放入一个类型中,比如 string_enum,

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

不是真正的零成本,但相当高效:使用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("hello world")

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

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

【讨论】:

  • 认为使用std::set 会更容易实现。它完全消除了对enum 的需要
  • 我喜欢这个,虽然我不会把枚举作为键,把字符串作为值吗?
  • @Robert 取决于您的需求。你的问题听起来就像你需要它一样。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2010-11-06
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多