我正在从配置文件中读取值:
txtype=value
值可以是四个值之一:发送,接收器,收发器,任何。有很多现有代码可用于从文件中读取键值对,因此我只需要将其表示为一种类型即可。
我想将此表示为枚举:
enum txtype { transmit = "transmit", receiver = "receiver", transceiver = "transceiver", any = "any" }
但是我现在意识到我无法使用c ++ 98做到这一点。在c ++ 98中还有其他方法可以做到这一点吗?
答案 0 :(得分:1)
这实际上取决于您的编译器将支持什么。如果您的编译器支持map
,则只需在字符串和整数索引之间创建一个map
,就可以使用enum
将其分配为std::map<std::string, int>
值。 enum
在下面被省略了,因为您可以定义和声明一个实例来根据需要分配返回的索引。例如,使用map
的简短示例是
#include <iostream>
#include <string>
#include <map>
int main (void) {
std::map<std::string, int> m = {
{"transmit", 0},
{"receiver", 1},
{"transceiver", 2},
{"any", 3}
};
std::string s;
while ((std::cin >> s))
std::cout << s << " - " << m[s] << '\n';
}
(注意:如果您使用的是Visual C ++ 12或更早版本,则不能使用{...}
通用初始化程序)
使用/输出示例
$ printf "receiver\ntransceiver\nany\ntransmit\n" | ./bin/map_str_int
receiver - 1
transceiver - 2
any - 3
transmit - 0
如果您的编译器不支持map
,则可以使用std::string
和一个简单的函数来与std::string
数组的内容进行比较,并返回索引。匹配类型,例如
#include <iostream>
#include <string>
const std::string txstr[] = { "transmit",
"receiver",
"transceiver",
"any" };
const int ntypes = sizeof txstr / sizeof *txstr;
int gettxtype (const std::string& s)
{
int i;
for (i = 0; i < ntypes; i++)
if (txstr[i] == s)
return i;
return -1;
}
int main (void) {
std::string s;
while ((std::cin >> s)) {
int type = gettxtype(s);
if (type >= 0)
std::cout << s << " - " << type << '\n';
}
}
(作为上述好处,如果找不到匹配的类型,可以通过返回-1
来确定所提供的类型是否与任何已知的txtype不匹配。)
使用/输出相同。仔细研究一下,如果您还有其他问题,请告诉我。
答案 1 :(得分:0)
我认为枚举是不可能的,但是Hashtable会帮助您。
哈希表具有键值对。
分配值:
A [传送] =“传送” ...
访问:
字符串x;
x = A [发送]将返回发送。
这里A是您的哈希表名称。
答案 2 :(得分:0)
好吧,您可以用某种方式来伪造它:充分利用C / C ++中的枚举实际上只是数字这一事实,因此请使用默认编号(因为您已经拥有了)。
当您以字符串形式读取值时,请在std::array
或std::map
中搜索相应的映射并使用索引。
使用伪代码:
valueAsString <- readStringFromFile; // your logic
idx <- getIndexFromMap[valueAsString];
yourEnum = static_cast<txtype>(idx);
编辑:
当然,这里最好是从字符串表示形式到枚举值的直接映射:
std::map<std::string, txtype> mapping = { /* initialize */ };
for (auto&& key : keys) {
process(mapping[key]);
}