полиморфизм — что такое идиоматический современный C ++ для алгебраических типов данных?

Предположим, например, что вы хотите реализовать ячейку электронной таблицы в C ++. Ячейка может быть либо строкой, числом, либо, возможно, пустой. Проигнорируйте другие случаи, как это, будучи формулой.

В Haskell вы можете сделать что-то вроде:

data Cell = CellStr String | CellDbl Double | None

Что считается текущей «лучшей практикой» для этого в C ++? Использовать объединение в структуре с индикатором типа или что-то еще?

26

Решение

struct empty_type {};
using cell_type = boost::variant<std::string, double, empty_type>;

Тогда вы бы сделали что-то с клеткой с помощью:

boost::apply_visitor(some_visitor(), cell);
21

Другие решения

Наследование?

Я должен сказать, что мне не очень нравится этот метод и я не считаю его современным, но он все еще кажется стандартным

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 {
...
};

Некоторые из недостатков:

  • При получении фактического значения вам нужно использовать разные функции. Это обычно включает использование instanceof и кастинг.

  • Различные объекты не могут быть непосредственно помещены в контейнер, только как указатели.

5

Стандартный способ реализации полиморфизма — виртуальные классы. http://www.cplusplus.com/doc/tutorial/polymorphism/

Это основной механизм C ++.

-1
По вопросам рекламы [email protected]