1

ファイルから読み取ったデータを保存しようとしています。データは配列であり、いくつかのタイプのいずれかになります。short、float など。このデータをクラスに抽象化しようとしているので、すぐに次のように考えました。

class BaseData {
public:
    void *data;
    virtual void foo() = 0;
};

template <typename T>
class Data : public BaseData {
public:
    T *data;

    Data(const File *file) {
        data = (T*) file->data;
    }

    T operator()(int x, int y, int z) {
       return data[x + y*yd + z*zd];
    }

    void foo() {}
};

ファイルを読み取って適切なオブジェクトをインスタンス化するときに switch ステートメントを使用し、次に、さまざまなデータ オブジェクトを操作するときに使用します。

if (Data<short> *d = dynamic_cast<Data<short> *>(image->data)) {
   cout << (*d)(100, 50, 100) << endl;
}

image->data は typeBaseDataです。

これについてどう思いますか?これは物事を進める正しい方法ですか?理想的には、配列 (および型) を取得して処理を行いたいのですが、コンパイル時に型がどうなるかわかりません。

4

1 に答える 1

1

これについてどう思いますか?これは物事を進める正しい方法ですか?理想的には、配列 (および型) を取得して処理を行いたいのですが、コンパイル時に型がどうなるかわかりません。

はい、一般的に言えば、あなたがやっているようなパラメトリック多態性ラッパーを作成することは良いアプローチです。これは、 に例示されている「Any」設計パターンに似ておりboost::any、int、float などの無関係な非ポリモーフィック型に実行時の型情報を付加します。

boost::variantまた、どれが類似しているがわずかに異なるアプローチであるかを確認する必要があります。バリアントでは、型のセットが Base のテンプレート パラメーターになります。長所として、これにより、いくつかの追加のコンパイル時のチェックと、わずかに効率的な実装が可能になりますが、短所として、間違いなくより複雑なインターフェイスがあります。

于 2013-07-12T21:48:42.307 に答える