que - ¿Qué es el C++ idiomático moderno para los tipos de datos algebraicos?
ejemplos de tipos de datos (3)
Supongamos, por ejemplo, que desea implementar una celda de hoja de cálculo en C ++. Una celda puede ser una cadena, un número o tal vez vacía. Ignora otros casos, como si fuera una fórmula.
En Haskell, podrías hacer algo como:
data Cell = CellStr String | CellDbl Double | None
¿Qué se considera la "mejor práctica" actual para hacerlo en C ++? ¿Usar una unión en una estructura con un indicador de tipo, o algo más?
¿Herencia?
Debo decir que no me gusta mucho este método y que no lo consideraría moderno, pero aún parece ser el estándar.
class DoubleCell : public Cell {
double value;
public:
DoubleCell( double v ) : value(v) {}
double DoubleValue() { return value; }
...
};
class StringCell : public Cell {
std::string value;
public:
StringCell( std::string v ) : value(v) {}
std::string StringValue() { return value; }
...
};
class EmptyCell : public Cell {
...
};
Algunos de los inconvenientes son:
Al obtener el valor real, es necesario utilizar diferentes funciones. Esto usualmente involucra el uso de
instanceof
y casting.No se pueden poner objetos diferentes directamente en un contenedor, solo como punteros.
La forma estándar de implementar el polimorfismo es por clases virtuales. http://www.cplusplus.com/doc/tutorial/polymorphism/
Este es un mecanismo básico de C ++.
struct empty_type {};
using cell_type = boost::variant<std::string, double, empty_type>;
Entonces harías algo con la celda con:
boost::apply_visitor(some_visitor(), cell);