所以,当我本来下投票,因为这是我想选择一个预处理器声明。这是我制定的解决方案。
我有两个头文件第一个是这个
#pragma once
#include "hdf5.h"
template <typename T> hid_t HdfType();
template<> hid_t HdfType<short>() { return H5T_NATIVE_SHORT; }
template<> hid_t HdfType<unsigned short>() { return H5T_NATIVE_USHORT; }
template<> hid_t HdfType<int>() { return H5T_NATIVE_INT;}
template<> hid_t HdfType<unsigned int>() { return H5T_NATIVE_UINT; }
template<> hid_t HdfType<long>() { return H5T_NATIVE_LONG; }
template<> hid_t HdfType<unsigned long>() { return H5T_NATIVE_ULONG; }
template<> hid_t HdfType<long long>() { return H5T_NATIVE_LLONG; }
template<> hid_t HdfType<unsigned long long>() { return H5T_NATIVE_ULLONG; }
template<> hid_t HdfType<char>() { return H5T_NATIVE_CHAR; }
template<> hid_t HdfType<unsigned char>() { return H5T_NATIVE_UCHAR; }
template<> hid_t HdfType<signed char>() { return H5T_NATIVE_SCHAR; }
template<> hid_t HdfType<float>() { return H5T_NATIVE_FLOAT; }
template<> hid_t HdfType<double>() { return H5T_NATIVE_DOUBLE; }
template<> hid_t HdfType<long double>() { return H5T_NATIVE_LDOUBLE; }
此文件从#define
返回预定义的句柄数。第二个文件包含以下内容
#pragma once
#include "hdf5.h"
#include "HdfTypeTemplate.h"
#include <vector>
template <typename T, int dims=1, int numColumns =1>
void CollectiveHdfBlockImport(hid_t datasetId, long long startRowIndex, long long numRowsToImport, std::vector<T>& data)
{
data.resize(numRowsToImport * numColumns + 10);
hid_t dtplId = CreateCollectiveDataTransferPropertiesList();
hid_t dataspaceId = H5Dget_space(datasetId);
hsize_t start[2] = { 0 }, count[2] = { 0 }, strideAndBlocks[2] = { 1,1 };
count[0] = numRowsToImport;
count[1] = numColumns;
start[0] = startRowIndex;
start[1] = 0;
hid_t memspaceId = H5Screate_simple(dims, count, NULL);
H5Sselect_hyperslab(dataspaceId, H5S_SELECT_SET, start, strideAndBlocks, count, strideAndBlocks);
H5Dread(datasetId, HdfType<T>(), memspaceId, dataspaceId, dtplId, data.data());
H5Sclose(dataspaceId);
H5Sclose(memspaceId);
H5Pclose(dtplId);
}
您会看到HDFType()放置在正确的位置。这将执行特定数据块的导入。它使用了一个模板,所以我可以轻松地使用它在我的代码中创建函数,而无需重新使用它。通过不定义一般模板和使用模板专业化,我可以将案例限制在我知道的一般人们将在图书馆中使用的情况中。如果需要一个新案例,我可以构建一个。
如果有人有更好的解决方案,请发布它们。
'#define'是一个预处理指令;在编译器甚至标记程序之前对它进行评估;所以我没有机会以某种方式根据稍后编译步骤中评估的类型选择一组不同的'#define'语句。但我不确定这是否是您的问题。 –