フォーマットされていない fortran ファイルから 1 次元配列を読み取る this 関数があります。
template <typename T>
void Read1DArray(T* arr)
{
unsigned pre, post;
file.read((char*)&pre, PREPOST_DATA);
for(unsigned n = 0; n < (pre/sizeof(T)); n++)
file.read((char*)&arr[n], sizeof(T));
file.read((char*)&post, PREPOST_DATA);
if(pre!=post)
std::cout << "Failed read fortran 1d array."<< std::endl;
}
私はこれを次のように呼びます:
float* new_array = new float[sizeof_fortran_array];
Read1DArray(new_array);
Read1DArray が「file」という名前の ifstream を含むクラスの一部であり、sizeof_fortran_array が既知であると仮定します。(そして、Fortran のフォーマットされていない書き込みにあまり慣れていない人のために、'pre' データは配列の長さをバイト単位で示し、'post' データは同じです)
私の問題は、float* または double* を使用してこの関数を呼び出したいシナリオがあることですが、これは実行時までわかりません。
現在、私がしているのは、読み取るデータ型のフラグを設定するだけで、配列を読み取るときに、次のようなコードを複製します。ここで、データ型は実行時に設定される文字列です。
if(datatype=="float")
Read1DArray(my_float_ptr);
else
Read1DArray(my_double_ptr);
関数呼び出しを2つのタイプで複製する必要がないように、誰かがこれを書き直す方法を提案できますか? これらは、それを呼び出す必要がある唯一の 2 つのタイプですが、私はそれをかなりの回数呼び出す必要があり、この重複をいたるところに配置したくありません。
ありがとう
編集: call_any_of 関数でラップするという提案に応えて、これは十分ではありません。
if(datatype=="float")
{
Read1DArray(my_float_ptr);
Do_stuff(my_float_ptr);
}
else
{
Read1DArray(my_double_ptr);
Do_stuff(my_double_ptr);
}
// More stuff happening in between
if(datatype=="float")
{
Read1DArray(my_float_ptr);
Do_different_stuff(my_float_ptr);
}
else
{
Read1DArray(my_double_ptr);
Do_different_stuff(my_double_ptr);
}