作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从配置文件中读取一个值:
txtype=value
value 可以是以下四个值之一:transmit、receiver、transceiver、any。有很多现有代码可用于从文件中读取键值对,因此我只需将其表示为一种类型即可。
我想将其表示为一个枚举:
enum txtype { transmit = "transmit", receiver = "receiver", transceiver = "transceiver", any = "any" }
但我现在意识到我不能用 c++ 98 做到这一点。在 c++ 98 中有没有其他方法可以做到这一点?
最佳答案
这实际上取决于您的编译器将支持什么。如果你的编译器支持 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
来确定提供的类型是否与任何已知的 txtypes 不匹配。)
使用/输出相同。查看所有内容,如果您还有其他问题,请告诉我。
关于c++ - 将键值表示为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492349/
我是一名优秀的程序员,十分优秀!