假设,例如,您想在C++中实现电子表格单元格。单元格可以是字符串、数字或空白。忽略其他情况,比如它是一个公式。
在Haskell中,你可能会这样做:
在Haskell中,你可能会这样做:
data Cell = CellStr String | CellDbl Double | None
在C++中,目前被认为是最佳实践的做法是什么?在结构中使用联合和类型指示器,或者其他方法?
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
和强制类型转换。
不同的对象不能直接放入容器中,只能作为指针。
??? getValue(){return value;}
- 463035818_is_not_a_number
boost::variant
。 - Pixelchemistvector<pair<XYCoords, double>> doubles;
和一个已排序的vector<pair<XYCoords, string>> strings;
。对于给定的单元格坐标,您可以在doubles
中使用lower_bound
,如果找不到,则在strings
中执行相同操作,否则为None
。绘制屏幕应该非常快,您只需遍历vector
即可。计算有点混乱,因为它们取决于类型,但您可能可以将其抽象化。实际上,我只是作弊了,从未将不同类型组合成一个。无论如何,这个问题太广泛和主观了。 - nwplang-hs
而不是lang-haskell
。下次您想要添加Haskell代码的高亮时请记住这一点。 - Bakuriu