将键值表示为枚举

时间:2018-11-27 03:34:33

标签: c++

我正在从配置文件中读取值:

txtype=value

值可以是四个值之一:发送,接收器,收发器,任何。有很多现有代码可用于从文件中读取键值对,因此我只需要将其表示为一种类型即可。

我想将此表示为枚举:

 enum txtype { transmit = "transmit", receiver = "receiver", transceiver = "transceiver", any = "any" }

但是我现在意识到我无法使用c ++ 98做到这一点。在c ++ 98中还有其他方法可以做到这一点吗?

3 个答案:

答案 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是您的哈希表名称。

https://en.cppreference.com/w/cpp/container/unordered_map

https://en.cppreference.com/w/cpp/utility/hash

答案 2 :(得分:0)

好吧,您可以用某种方式来伪造它:充分利用C / C ++中的枚举实际上只是数字这一事实,因此请使用默认编号(因为您已经拥有了)。 当您以字符串形式读取值时,请在std::arraystd::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]);
}