情况:
我正在创建一个用作C++中的hdf5的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复合数据类型),如何以某种方式将程序结构化,以最大程度地减少以后的工作量?

最佳答案

模板特化是否可以满足您的需求?

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>()获得数据类型。

10-07 19:23
查看更多