2016-09-18 52 views
2

我有一些包含数据的文件和一个可以识别文件数据类型的函数peekType()。各种功能取决于数据类型。要考虑的文件数量不应该是硬编码的。模板:递归直到推导出适当的参数

我想我会传递一个文件名列表到一个函数,并递归地从参数包中弹出这些文件名,直到定义匹配一些基本情况,此时基本情况会接管。像这样:

//Base case 
template<class tA, class tB> 
int PerformAlgorithm(std::vector<tA> a, std::vector<tB>){ 
    //Do stuff 
} 

//Recursive part 
template<typename... Arguments > 
int PerformAlgorithm(std::string inputfile, Arguments ... args){ 
    switch(peekType(inputfile)){ 
    case TYPE_BYTE: { 
     std::vector<uint8_t> arr; 
     return PerformAlgorithm(args..., arr); 
    } 
    case TYPE_FLOAT: { 
     std::vector<double> arr; 
     return PerformAlgorithm(args..., arr); 
    } 
    default: 
     std::cerr<<"Unrecognised type!"<<std::endl; 
     return -1; 
    } 
} 

PerformAlgorithm("fileA", "fileB"); 

不幸的是,上述从未达到的基本情况,产生的问题,如:

cannot convert ‘args#0’ (type ‘std::vector<double>’) to type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ 

我要去哪里错了?

我基于模板元编程因子示例做出的替代尝试也失败了。

+0

我已经复制了一个类似的场景,它的工作原理。 –

+1

[类似情景](https://ideone.com/pfz9Yg)。它可能是有用的 –

+0

谢谢,@BiagioFesta:我会研究:这是一个很好的MWE! (除PRNG被滥用的方式之外。) – Richard

回答

0

Here The Solution

template<typename A, typename B> 
void foo(const std::vector<A>& va, 
     const std::vector<B>& vb) { 
    std::cout << "-----The end of recursion-----\n" 
     "Type VectorA: " << typeid(A).name() << "\n" 
     "Type VectorB: " << typeid(B).name() << "\n" 
     "----------------------------------------\n"; 
} 

template<typename... Args> 
void foo(std::string str, Args... args) { 
    int number = give_me_anumber(); 
    if (number == 0) { 
    std::vector<int> vector; 
    foo(args..., vector); 
    } else if (number == 1) { 
    std::vector<double> vector; 
    foo(args..., vector); 
    } 
} 

正如我们已经写过评论中的设计工作,问题出现在调用函数中。