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
instanceofy 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);