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

What is idiomatic modern C++ for algebraic data types?

本文关键字:C++ 代数数据类型 什么      更新时间:2023-10-16

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

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

data Cell = CellStr String | CellDbl Double | None

目前在C++中做这件事的"最佳实践"是什么?在具有类型指示符的结构中使用并集,还是其他什么?

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

然后你可以用对细胞做一些事情

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

继承?

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

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和铸造。

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