たとえば、スプレッドシートのセルをC++で実装するとします。セルは、文字列、数値、または空のいずれかです。数式など、他のケースは無視してください。
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
の使用とキャストが含まれます。
異なるオブジェクトをコンテナに直接入れることはできず、ポインタとしてのみ入れることができます。