【问题标题】:c++ hdf5: how to design program for easy extension to new compound datatypesc++ hdf5:如何设计程序以轻松扩展新的复合数据类型
【发布时间】:2012-11-23 23:37:31
【问题描述】:

情况: 我正在创建一个在 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 复合数据类型,我该如何构建程序以尽量减少以后的工作量?

【问题讨论】:

  • 想到 boost::any 之类的东西

标签: c++ hdf5


【解决方案1】:

模板专业化是否适合您的需求?

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&lt;T&gt;() 获取数据类型。

【讨论】:

  • 确实如此!非常感谢,虽然我知道这项技术,但我不知道它是否符合我的问题:)
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 2014-01-13
  • 1970-01-01
  • 2010-09-29
  • 2010-10-27
  • 1970-01-01
  • 2013-12-04
  • 2012-09-06
相关资源
最近更新 更多