我想使用映射到枚举成员的字符串。枚举值稍后将在开关中使用,以确定将执行哪些功能。我有以下代码:
#include <iostream>
#include <string>
#include <map>
#define MSG_BUFSIZE 100
enum CMDVAL
{
CMD_USEREXIT,
CMD_LOGIN
};
std::map<std::string, CMDVAL> map_cmdval;
void initCmdmap()
{
map_cmdval["exit"] = CMD_USEREXIT;
map_cmdval["login"] = CMD_LOGIN;
}
bool RUNNING = true;
int main()
{
initCmdmap();
char buffer[MSG_BUFSIZE];
while(RUNNING)
{
memset(buffer, '\0', MSG_BUFSIZE);
std::cin.getline(buffer, MSG_BUFSIZE);
switch (map_cmdval[buffer])
{
case CMD_USEREXIT:
RUNNING = false;
printf("Exiting...\n");
break;
case CMD_LOGIN:
printf("Logging in...\n");
break;
default:
printf("Invalid command\n");
break;
}
}
}
这会编译,但是,如果我尝试输入与映射中已定义的单词不同的单词,则将执行CMD_USEREXIT情况,而不是默认情况。我想念什么?最重要的是为什么会这样?
当您查看std::map::operator[]
时
返回对映射到与键等效的键的值的引用,如果该键尚不存在,则执行插入。
这意味着,当您从标准输入中读取值std::map::operator[]
时,将插入一个默认值为0的新元素foo
。
[map_cmdval["foo"]
的定义等同于
enum CMDVAL
[enum CMDVAL
为您提供的值为0,与enum CMDVAL
{
CMD_USEREXIT = 0,
CMD_LOGIN = 1
};
相同。