2014-03-12 32 views
0

下面是场景:我要加载二进制格式的列主修矩阵文件,该基体可以是short,int和double等 概念需要做的事情是这样的:在C++的运行时确定返回类型时该怎么办?

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

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

+2

欢迎来到编译时和运行时之间的区别。 –

+0

您需要一个类型,其大小在运行时确定。参见例如'std :: vector'。你可以围绕它建立一个矩阵类。 – juanchopanza

+0

但我不担心这里的大小,我需要得到这个类型。 – qed

回答

3

你不能这样做。在最简单的形式,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); 
} 

在从运行时间传递给编译在这个世界上,我认为这个世界尽可能地接近你。这可以进一步组织,参见例如。 herethis question。但我只是想提出一个想法。

+0

可以有一个接口的类不使用模板,但类知道它的元素大小。例如OpenCV的Matrix包装:'Mat A = Mat :: zeros(3,3,CV_32F);' –

+0

@GastónBengolea对于现有的库,是的,但在使用C++设计新程序时我不会这样做。 – iavr

相关问题