Posts

Showing posts from June, 2012

C++: Parse enums and convert them to other types elegantly

Spanish version / Versión en Español Quite often, we need to to read a value from some source (file, socket, database) and convert it to an enum. In order to define the conversion in a single place, in C++, we usually define a function like this one: enum MyEnum{ VALUE_A, VALUE_B, VALUE_C }; MyEnum ParseMyEnum( const std::string& sMyEnum ){ //Conversion } But where do we define this function? Our first idea is to make it a private method of the class which uses the enum, but this is not possible if the enum is used by more than one class. In those cases, we have no choice but to define the function as a free function inside a namespace. C#'s enums can have methods and extension methods, which would be the most natural and object oriented solution. Nevertheless, since we're talking C++ now, we can use templates to solve this problem in a generic way, for every enum, and use template specialization to define the specific mapping for each enum. This can be

C++: Parsear enums y convertirlos a otros tipos de forma elegante

Versión en inglés / English version Muchas veces queremos leer algún valor de cierta fuente (archivo, socket, base de datos) y convertirlo a un enum. Para no andar repitiendo el código de esa conversión, típicamente creamos una función de este estilo: enum MyEnum{ VALUE_A, VALUE_B, VALUE_C }; MyEnum ParseMyEnum( const std::string& sMyEnum ){ //Conversion } ¿Y dónde ponemos esta función? La primera idea es ponerla como método privado de la clase que usa el enum, pero esto no sirve si el enum es usado por más de una clase. En esos casos, no nos queda más alternativa que definir la función fuera de toda clase, dentro de un namespace. Los enums de C# pueden tener métodos, lo cual sería la solución más natural y orientada a objetos. Sin embargo, en C++ podemos usar templates para resolver este problema de forma genérica para todo enum, y usar especialización de templates para definir el mapeo específico de cada enum. Para ello, definimos el siguiente template: #prag