2017-05-21 10 views
0

テンプレート関数を作成して、ファイルに名前を付けたデータセットを読み込みたいとします。 これらの関数は、float、double、またはlong doubleのいずれかの型を読み取ることができます。 テンプレートの引数に基づいてデータ型を付与できますか? 今私は使用してそれを行うことができた:hdf5の任意のデータ型を読み取るためのテンプレート関数の作成

template <typename T> 
void gethdf(T * l, H5::H5File * file, char * name) 
{ 
    H5::DataSet dataset = H5::DataSet(file->openDataSet(name)); 
    H5::DataType dt; 

    if(typeid(T) == typeid(float)) 
    dt = H5::PredType::NATIVE_FLOAT; 

    ... 

dataset.read(l, dt); 
} 
+2

テンプレートの特殊化/ SFINAEを参照してください。あなたが持っているものは動作しません。詳細な説明は –

答えて

0

機能

template <typename T> 
class DataTypeFor 
{ 
public: 
} 

template <> 
class DataTypeFor<int> 
{ 
public: 
    const H5::DataType value = H5::PredType::NATIVE_INT; 
} 

template <> 
class DataTypeFor<float> 
{ 
public: 
    const H5::DataType value = H5::PredType::NATIVE_FLOAT; 
} 

template <> 
class DataTypeFor<double> 
{ 
public: 
    const H5::DataType value = H5::PredType::NATIVE_DOUBLE; 
} 

template <typename T> 
void gethdf(T * l, H5::H5File * file, char * name) 
{ 
    H5::DataSet dataset = H5::DataSet(file->openDataSet(name)); 
    H5::DataType dt; 

    dt = DataTypeFor<T>::value; 
    ... 
    dataset.read(l, dt); 
} 
+0

です。私はこのテンプレートクラスを使用してそれを行います... – user2084492

1

を変更します余分なテンプレートを追加し、私はHDF5が何であるか知らないが、あなたは次のことを行うことができますように見えます:

あなたの関数で
template<typename T> 
H5::DataType get_datatype_for(); 

template<> 
H5::DataType get_datatype_for<float>() { return H5::PredType::NATIVE_FLOAT; } 

そして:

H5::DataType dt = get_datatype_for<T>(); 
+0

これは便利です!私はそれを実装します! Tks – user2084492

関連する問題