2016-09-18 3 views
2

データを含むいくつかのファイルと、ファイルのデータ型を認識できる関数peekType()があります。さまざまな機能は、データ型がどのようなものになるかによって異なります。考慮するファイルの数をハードコードするべきではありません。テンプレート:適切なパラメータが推定されるまで再帰

私は関数にファイル名のリストを渡し、その定義が何らかの基底の場合と一致するまでそれらのファイル名を再帰的にポップすると考えました。これと同じように:

私は間違っているつもりです
cannot convert ‘args#0’ (type ‘std::vector<double>’) to type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ 

//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"); 

残念ながら、上記のような問題をもたらす、基本ケースに到達したことがありませんか?

また、私はテンプレートmetaprogramming factorialの例に基づいて作成しました。

+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); 
    } 
} 

あなたの設計がうまくいっているように、問題は呼び出し関数にありました。

関連する問題