tipos que programacion ejemplos definicion datos c++ polymorphism unions variant algebraic-data-types

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.



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