Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string转换为枚举类的正确方法_C++_String_Dictionary_Input_Enums - Fatal编程技术网

C++ 将std::string转换为枚举类的正确方法

C++ 将std::string转换为枚举类的正确方法,c++,string,dictionary,input,enums,C++,String,Dictionary,Input,Enums,对于我目前正在进行的作业,我为不同的学期定义了一个枚举类 enum class Semester { FALL, SPRING, SUMMER }; 在我重载的中,不要麻烦使用std::map,只需使用一个函数: //另外,请避免使用大写的枚举名 枚举班学期{ 落下 春天 夏天 }; std::字符串到_字符串(常量学期&s){ 开关{ 案例学期::秋季:返回“秋季”; 案例学期:春天:回归“春天”; 案例学期:夏季:返回“夏季”; 默认值:th

对于我目前正在进行的作业,我为不同的学期定义了一个枚举类

enum class Semester {
        FALL,
        SPRING,
        SUMMER
};

在我重载的
中,不要麻烦使用
std::map
,只需使用一个函数:

//另外,请避免使用大写的枚举名
枚举班学期{
落下
春天
夏天
};
std::字符串到_字符串(常量学期&s){
开关{
案例学期::秋季:返回“秋季”;
案例学期:春天:回归“春天”;
案例学期:夏季:返回“夏季”;
默认值:throw std::exception(“to_字符串:学期枚举值已更改”);
}
}
从字符串开始的学期(std::string str){
std::transform(std::begin(str)、std::end(str)、std::begin(str),[](无符号字符c)->无符号字符{返回std::tolower(c);});
如果(str==“坠落”){
返回学期:秋季;
}否则如果(str==“弹簧”){
返回学期:春天;
}else if(str==“summer”){
返回学期:夏季;
}否则{
抛出std::exception(“from_string:学期枚举值已更改”);
}
}

ostream&operatorI不认为您在学习时应该担心“最佳”代码。通常情况下,您会被无关的性能问题所困扰,以至于在实际功能上无法取得任何进展,或者最终陷入难以调试的奇怪问题。映射很好,但更常见的方法是只使用数组。通过当前使用此映射的方式,您在这里收获不多,但如果您的枚举是超出范围的值,则映射将隐式添加新的空字符串,而未经检查的数组访问将导致未定义的行为。我很好奇解决此问题的“正确”方法是什么。就像编程中的许多事情一样,这是一个意见问题。为什么函数比映射更好?有人可能会认为映射使用了不必要的内存。但是,这里有一个维护问题,需要保留两组字符串。我个人使用单个表进行枚举到字符串的查找,并在同一个表中搜索字符串到枚举的查找。同样,设计要求、项目动机、枚举数等问题。。。这确实是一个基于意见的问题,这就是为什么我没有回答它。@JohnKugelman见paddy的评论。:)都是好的。我已经对包含数百个值的枚举执行了上述操作。:-)我有一个问题,那就是当事情失败时,抛出而不是将流设置为失败状态。@TEDLYNGO在枚举值更改时大声失败,这清楚地表明“嘿,别忘了也更改这些函数!”
std::map<Semester, std::string> to_string
{
        {Semester::FALL, "fall"},
        {Semester::SPRING, "spring"},
        {Semester::SUMMER, "summer"}
};

std::stream& operator <<(std::stream& ost, enum Semester semester)
{
        return ost << ::to_string[semester];
}