在c++中,当返回类型在运行时确定时该怎么做
what to do when return type is determined in runtime in c++?
这个场景是这样的:我有一个二进制格式的列矩阵文件要加载,矩阵可以是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);
}
从运行时传递到编译时,我认为这是您所能得到的最接近的。这可以进一步组织,例如这里和这个问题。但我只是想给出一个想法。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 读取文件时运行时的未知行为
- 函数在Windows或Linux上运行时表现不同
- 在声明中合并两个常量"std::set"(不是在运行时)
- AWS Lambda C++运行时权限被拒绝
- 通过switch和static_cast访问多态对象的运行时类型
- 如何修复 Onnx运行时会话>运行问题?