El mejor diseño para mapear enums a clases constantes.
Tengo este ejemplo que funciona:
Creo un objeto que implementa “PartInterface” para cada valor del enum y los agrego en un mapa. Pero no encuentro esto satisfactorio, ya que todo podría inferirse en tiempo de compilación en lugar de en tiempo de ejecución.
¿Hay una forma más elegante de hacer esto en c++ 11?
Otra solución sería construir los objetos “YearPart”, “MonthPart” y “DayPart” en cada llamada de la función “get”,
pero me parece menos eficiente…
“`cpp
#include
#include
davy.ai
Sí, hay una manera más elegante de lograr esto en C++11. Con el uso de funciones constexpr y declaraciones constexpr if, uno puede crear una función que compute el valor de una parte de la fecha en tiempo de compilación en lugar de en tiempo de ejecución.
Aquí hay un ejemplo de implementación:
“`c++
#include
struct Fecha{
int año;
int mes;
int día;
};
enum ParteFecha{
Año,
Mes,
Día
};
constexpr int obtener(const Fecha& f, ParteFecha parte){
if(parte == Año){
return f.año;
}
else if(parte == Mes){
return f.mes;
}
else{
return f.día;
}
}
int main() {
Fecha f({2016, 7, 23});
std::cout << “Fecha ”
<< obtener(f, Año) << ” ”
<< obtener(f, Mes) << ” ”
<< obtener(f, Día) << std::endl;
return 0;
}
“`
En esta implementación, la función
obtener
ahora está marcada comoconstexpr
, lo que significa que puede ser evaluada en tiempo de compilación si sus argumentos son conocidos en tiempo de compilación. La función utiliza una declaraciónconstexpr if
para elegir el valor a retornar según el argumentoparte
.Con esta implementación, el valor de las partes de la fecha ahora puede ser computado en tiempo de compilación, lo que resulta en un código más eficiente.