什么是代数数据类型的惯用现代C ++?

时间:2016-03-29 11:49:50

标签: c++ polymorphism unions variant algebraic-data-types

例如,假设您要在C ++中实现电子表格Cell。单元格可以是字符串,数字,也可以是空的。忽略其他情况,例如它是一个公式。

在Haskell中,您可能会执行以下操作:

data Cell = CellStr String | CellDbl Double | None

什么被认为是当前的最佳实践"在C ++中做到这一点?在具有类型指示符的结构中使用union,还是其他什么?

3 个答案:

答案 0 :(得分:21)

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

然后你会用单元格做一些事情:

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

答案 1 :(得分:5)

继承?

我不得不说我不喜欢这种方法而且不会认为它是现代的,但它似乎仍然是标准的。

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和施放。

  • 不能将不同的对象直接放入容器中,只能作为指针。

答案 2 :(得分:-1)

实现多态的标准方法是通过虚拟类。 http://www.cplusplus.com/doc/tutorial/polymorphism/

这是一个基本的C ++机制。