2

状況: C++ で h​​df5 の API として機能するクラスを作成しています。基本的に、hdf5 C API のすべての核心をカプセル化しています。将来的には、複合データ型を格納するという点でさまざまな要件が生じると予想しています。複合データ型は C 構造体になります。各構造体は、対応する hdf5 複合データ型 (要素のオフセットなど) を設定するために独自の関数を必要とするため、データベースに異なる構造体を格納するために単純にテンプレートを使用することはできません。したがって、これは十分ではありません。

class simDB{
  public:
    template<class T> int write_to_dataset(vector<T> mydata){...}
}

代わりに、今後のデータ型ごとに個別のヘッダー ファイルを作成することを考えました。

// type1_t.h
struct type1_t{
  int bla1;
  double bla2;
};

hid_t type1_memtype(){
  hid_t memtype = H5Tcreate(H5T_COMPOUND, sizeof(type1_t));
  herr_t status = H5Tinsert (memtype, "bla1", HOFFSET (type1_t, bla1), H5T_NATIVE_INT);
  herr_t status = H5Tinsert (memtype, "bla2", HOFFSET (type1_t, bla2), H5T_NATIVE_DOUBLE);
}

ただし、データ型ごとに適切な memtype 関数を呼び出す必要があるため、データ型ごとに個別の読み取り/書き込み関数を記述する必要があるため、これではさらに先には進みません。上記のコードをクラスに変換することは、私が知る限り、オブジェクトにメソッドがない場合にのみ構造体とオブジェクトのメモリ レイアウトが保証されるため、実行可能ではないように思われますが、生成するには上記のメンバー関数が必要です。 hdf5 データ型。

保存する新しいタイプの構造体、つまり新しい hdf5 複合データタイプを追加したい場合、後で労力を最小限に抑える方法でプログラムを構築するにはどうすればよいですか?

4

1 に答える 1

2

テンプレートの専門化はあなたのニーズに合っていますか?

template <> get_memtype<type1_t> {
    hid_t memtype = H5Tcreate(H5T_COMPOUND, sizeof(type1_t));
    herr_t status = H5Tinsert (memtype, "bla1", HOFFSET (type1_t, bla1), H5T_NATIVE_INT);
    herr_t status = H5Tinsert (memtype, "bla2", HOFFSET (type1_t, bla2), H5T_NATIVE_DOUBLE);
}

そのため、後で を使用してデータ型を取得できますget_memtype<T>()

于 2012-12-06T10:31:48.060 に答える