在c++中,当返回类型在运行时确定时该怎么做

what to do when return type is determined in runtime in c++?

本文关键字:定时 运行时 c++ 返回类型      更新时间:2023-10-16

这个场景是这样的:我有一个二进制格式的列矩阵文件要加载,矩阵可以是short、int、double等。从概念上讲,需要做这样的事情:

Mat<xxx> loadfile(std::string filename)
{
    std::string matType = gettype(filename);
    Mat<matType> mat;
    mat.load(filename);
    return mat;
}

但是问题是,因为我不知道返回类型,所以我不能首先定义函数

你不能这么做。在最简单的形式中,loadfile应该是这样的模板

template<typename T>
Mat<T> loadfile(std::string filename)
{
    Mat<T> mat;
    mat.load(filename);
    return mat;
}

所以用户通过

显式指定类型
Mat<int> mat = loadfile<int>("filename.mat");

现在,如果文件已经嵌入了关于类型的信息,你可以在运行时做的是,例如,如果T与实际存储的类型不一致,则抛出异常。

如果可能的类型数量有限,您可以使用模板函数(例如run<T>)来指定您需要对数据(算法)做什么,并根据输入进行选择,例如

is_type_real(filename) ? run<double>(filename) : run<int>(filename);

在这种情况下,编译器在编译时实例化所有可能的(这里有两个)算法版本(专门化),并在运行时调用适当的版本。

这个想法可以扩展到一个指针到函数的查找表,它可能看起来很接近您的想法:

template<typename T>
void run(std::string filename)
{
   Mat<T> mat = loadfile<T>(filename); 
   // run algorithm for type T
}
using fun = void(*)(std::string);
fun lookup[4] = { run<int>, run<long>, run<float>, run<double> };
enum matrix_type { Int, Long, Float, Double };
matrix_type get_type(std::string filename)
{
   // read type from file, return it as a matrix_type
};
int main()
{
    std::string filename = "filename.mat";
    matrix_type type = get_type(filename);
    lookup[type](filename);
}

从运行时传递到编译时,我认为这是您所能得到的最接近的。这可以进一步组织,例如这里和这个问题。但我只是想给出一个想法。