gpt4 book ai didi

c++ - 在运行时之前调用类型未知的模板函数

转载 作者:行者123 更新时间:2023-11-30 01:57:45 25 4
gpt4 key购买 nike

我有一个函数可以从未格式化的 fortran 文件中读取一维数组:

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);

有人可以建议一种重写它的方法,这样我就不必用这两种类型重复函数调用了吗?这是仅有的两种调用它所必需的类型,但我不得不多次调用它,我不想到处都是这种重复。

谢谢

编辑:为了响应将其包装在 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);
}

最佳答案

如果你仔细想想这个标题,你就会意识到模板实例化是在编译时执行的,但你想根据仅在运行时可用的信息进行调度是矛盾的。在运行时,您无法实例化模板,因此这是不可能的。

您采用的方法实际上是正确的方法:在编译时实例化两个 选项,并在运行时根据可用信息决定使用哪一个。话虽如此,您可能想要考虑您的设计。

我想不仅读取而且处理都会根据该运行时值而有所不同,因此您可能希望将所有处理绑定(bind)到一个(可能是模板)函数中,用于每种类型并移动 if 进一步调用层次结构。


另一种避免必须基于类型分派(dispatch)到模板的不同实例化的方法是放弃一些类型安全并实现一个函数,该函数将 void* 分配给分配的内存和一个 size 参数,其中包含数组中类型的大小。请注意,这将更加脆弱,并且不能解决读取数据后必须对不同数组进行操作的整体问题,因此我不建议遵循此路径。

关于c++ - 在运行时之前调用类型未知的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com