web-dev-qa-db-ja.com

代数的データ型の慣用的な最新のC ++とは何ですか?

たとえば、スプレッドシートのセルをC++で実装するとします。セルは、文字列、数値、または空のいずれかです。数式など、他のケースは無視してください。

Haskellでは、次のようなことをするかもしれません:

data Cell = CellStr String | CellDbl Double | None

C++でそれを行うための現在の「ベストプラクティス」と考えられるものは何ですか?タイプインジケーターなどを備えた構造体でユニオンを使用しますか?

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

次に、次のセルを使用して何かを行います。

boost::apply_visitor(some_visitor(), cell);
21
Richard Hodges

継承?

私はこの方法があまり好きではなく、現代的だとは思わないと言わざるを得ませんが、それでも標準のようです。

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の使用とキャストが含まれます。

  • 異なるオブジェクトをコンテナに直接入れることはできず、ポインタとしてのみ入れることができます。

5
Frank Puffer