bli*_*ppy 28 c++ polymorphism variant algebraic-data-types unions
例如,假设您要在C++中实现电子表格Cell.单元格可以是字符串,数字,也可以是空的.忽略其他情况,例如它是一个公式.
在Haskell中,您可能会执行以下操作:
data Cell = CellStr String | CellDbl Double | None
Run Code Online (Sandbox Code Playgroud)
什么被认为是在C++中实现它的当前"最佳实践"?在带有类型指示符的结构中使用union,还是其他什么?
Ric*_*ges 21
struct empty_type {};
using cell_type = boost::variant<std::string, double, empty_type>;
Run Code Online (Sandbox Code Playgroud)
然后你会用单元格做一些事情:
boost::apply_visitor(some_visitor(), cell);
Run Code Online (Sandbox Code Playgroud)
遗产?
我不得不说我不喜欢这种方法而且不会认为它是现代的,但它似乎仍然是标准的.
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 {
...
};
Run Code Online (Sandbox Code Playgroud)
一些缺点是:
获取实际值时,需要使用不同的功能.这通常涉及使用instanceof和铸造.
不同的对象不能直接放入容器中,只能作为指针.
| 归档时间: |
|
| 查看次数: |
2956 次 |
| 最近记录: |