你不能这样做。在最简单的形式,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);
}
在从运行时间传递给编译在这个世界上,我认为这个世界尽可能地接近你。这可以进一步组织,参见例如。 here和this question。但我只是想提出一个想法。
欢迎来到编译时和运行时之间的区别。 –
您需要一个类型,其大小在运行时确定。参见例如'std :: vector'。你可以围绕它建立一个矩阵类。 – juanchopanza
但我不担心这里的大小,我需要得到这个类型。 – qed