时间:2019-05-17 标签:c++hdf5: how to design program for easy extension to new compound datatypes

标签 c++ hdf5

情况: 我正在创建一个类,用作 C++ 中 hdf5 的 API,基本上封装了 hdf5 C API 的所有细节。 我预计 future 在存储复合数据类型方面会有不同的要求。 复合数据类型将是 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>() 获取数据类型.

关于时间:2019-05-17 标签:c++hdf5: how to design program for easy extension to new compound datatypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735185/

相关文章:

python - 使用 h5py 压缩现有文件

python - 使用 Python 将 .h5 文件转换为 .jpg

c++ - 使用 HDF5 线程安全库

c++ - throw 可移动物体

c++ - 是否可以将三个数字插入到 2 个字节的变量中?

c++ - 在 C++ 中使用成员变量或静态变量?

c++ - 递归-此BST有什么区别?

c++ - 是否可以根据作用域改变函数的行为?

python - python 中是否有一个函数可以显示 .hdf5 文件的完整结构?

java - 将 HDF4 数组转储到 ascii,并具有源文件的完全精度