Cita:
Iniciado por dehm La cosa es que no he pillado la idea de la clase que planteas. Es decir, estas líneas, qué han de hacer?:
Código C++:
Ver originalif( it == _icons.end() )
{
// algoritmo para cargar el icono
// ...
// Se añade el icono a la caché
it = _icons.insert(std::make_pair(type,icon));
}
se supone que la clase que actua como proveedor de iconos debe inicializar la colección en algún momento.
La colección puedes inicializarla bajo demanda o completa del tirón y cada opción se programa de una forma diferente.
En el caso de cargar todos los iconos de una vez podría ser algo tal que (aprovechando el código que has hecho):
Código C++:
Ver originalenum class Sexo
{
undefined, male, female
};
class IconoWareHouse
{
// Clase estática. No debe tener constructores disponibles
IconoWareHouse() = delete;
public:
static std::string GetIcon(Sexo type)
{
auto it = _icons.find(type);
if( it == _icons.end() )
it = _icons.find(Sexo::undefined);
return it->second;
}
private:
static std::map<Sexo,std::string>_icons;
static decltype(_icons) InitMap()
{
// Opción con inicializadores de lista
return decltype(_icons){ std::make_pair(Sexo::undefined,"error"),
std::make_pair(Sexo::male,"niño"),
std::make_pair(Sexo::female,"niña") };
}
};
std::map<Sexo,string> IconoWareHouse::_icons(InitMap());
Nota el uso de decltype para evitar repetir todo el rato la declaración del mapa. Piensa que no suele ser adecuado repetir un tipo cada dos por tres porque luego al intentar portar la solución a Qt te obliga a hacer demasiados cambios.
También puedes usar typedef o using (typedef sirve para estándares anteriores a C++11):
Código C++:
Ver originalclass IconoWareHouse
{
// Clase estática. No debe tener constructores disponibles
IconoWareHouse() = delete;
public:
// Alias declarado con typedef
typedef std::map<Sexo,std::string> IconsMap;
// Alias declarado con using
using IconsMap = std::map<Sexo,std::string>;
static std::string GetIcon(Sexo type)
{
auto it = _icons.find(type);
if( it == _icons.end() )
it = _icons.find(Sexo::undefined);
return it->second;
}
private:
static IconsMap_icons;
static IconsMap InitMap()
{
// Opción con inicializadores de lista
return IconsMap{ std::make_pair(Sexo::undefined,"error"),
std::make_pair(Sexo::male,"niño"),
std::make_pair(Sexo::female,"niña") };
}
};
Por cierto, nota que make_pair es más cómodo y limpio que tener que hacer una declaración explícita de pair cada vez que insertas un elemento en el mapa.
Un saludo.