情况: 我正在创建一个类,用作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复合数据类型,我如何以最小化工作量的方式构建程序?
答案 0 :(得分: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>()
获取数据类型。