c++ - findoneandupdate - Enlazar un char a un tipo enum
solidity español (3)
Tengo un código bastante similar a esto:
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;
}
}
}
};
Ahora imagina que tengo muchos más tipos de enum y sus nombres son más largos ... bueno, lo que obtengo no es un código muy bueno y me preguntaba si sería posible enlazar un char específico con un tipo enum y quizás hacer algo como esto :
for(int i=0;i<Full.size();i++)
{
cout<(Full[i]).MyChar();
}
O cualquier otro método que podría hacer que este código sea "más bonito". es posible?
Creo que la mejor solución en este caso sería usar un mapa:
#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];
}
}
};
En una situación como esta podrías ser complicado y lanzar tus personajes.
enum Section{
START = (int)''S'',
MID = (int)''M'',
END = (int)''E''
};
...
inline char getChar(Section section)
{
return (char)section;
}
Lamentablemente, no hay mucho que puedas hacer para limpiar esto. Si tiene acceso a la función del enumerador fuertemente tipada C ++ 11, entonces podría hacer algo como lo siguiente:
enum class Section : char {
START = ''S'',
MID = ''M'',
END = ''E'',
};
Y luego podrías hacer algo como:
std::cout << static_cast<char>(Full[i]) << std::endl;
Sin embargo, si no tiene acceso a esta característica, entonces no hay mucho que pueda hacer, mi consejo sería tener un mapa global std::map<Section, char>
, que relacione cada sección enum
con un carácter, o una función auxiliar con el prototipo:
inline char SectionToChar( Section section );
Que simplemente implementa la instrucción switch()
de una manera más accesible, por ejemplo:
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;
}
}
}