我有一段非常类似的代码:
class someclass
{
public:
enum Section{START,MID,END};
vector<Section> Full;
void ex(){
for(int i=0;i<Full.size();i++)
{
switch (Full[i])
{
case START :
cout<<"S";
break;
case MID :
cout<<"M";
break;
case END:
cout<<"E";
break;
}
}
}
};
现在想象我有更多的枚举类型,而且它们的名字更长...... 以及我得到的不是一个非常好看的代码,我想知道是否有可能将特定的字符串绑定到枚举类型,并可能做这样的事情:
for(int i=0;i<Full.size();i++)
{
cout<(Full[i]).MyChar();
}
或任何其他方法可以使此代码“更漂亮”。 这可能吗?
答案 0 :(得分:12)
不幸的是,你无法做很多事情来清理它。如果您可以访问C ++ 11强类型枚举器功能,那么您可以执行以下操作:
enum class Section : char {
START = 'S',
MID = 'M',
END = 'E',
};
然后你可以做类似的事情:
std::cout << static_cast<char>(Full[i]) << std::endl;
但是,如果您无法访问此功能,那么您可以做的事情就不多了,我的建议是拥有一个全局地图std::map<Section, char>
,它将每个enum
部分与一个角色相关联,或原型的辅助函数:
inline char SectionToChar( Section section );
它以更易于访问的方式实现switch()
语句,例如:
inline char SectionToChar( Section section ) {
switch( section )
{
default:
{
throw std::invalid_argument( "Invalid Section value" );
break;
}
case START:
{
return 'S';
break;
}
case MID:
{
return 'M';
break;
}
case END:
{
return 'E';
break;
}
}
}
答案 1 :(得分:5)
在这样的情况下,你可能会变得棘手并且施展你的角色。
enum Section{
START = (int)'S',
MID = (int)'M',
END = (int)'E'
};
...
inline char getChar(Section section)
{
return (char)section;
}
答案 2 :(得分:0)
我认为在这种情况下最好的解决方案是使用地图:
#include <iostream>
#include <map>
class someclass
{
public:
enum Section{START = 0,MID,END};
map<Section,string> Full;
// set using Full[START] = "S", etc
void ex(){
for(int i=0;i<Full.size();i++)
{
cout << Full[i];
}
}
};