c ++ hdf5: как разработать программу для простого расширения новых составных типов данных

Ситуация:
Я создаю класс, который служит API для hdf5 в C ++, по сути, инкапсулируя все мельчайшие детали 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?

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>(),

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]