2016-04-05 12 views
2

バリデーショナルテンプレートパックの配列やベクターを展開したいと思います。 次の例を考えてみましょう:variadicパラメータパックでベクトルまたは配列を展開するには?

template <typename T> 
int GetArgValue(std::string name,T& value){ 
    cout<<"GetArgumentValue(): name="<<name<<", val="<<value<<endl; 
    //Set value 
    //...       
    return 0; 
} 

template<typename ... Tn> 
int GetArgValues(std::vector<std::string> keys, Tn&... values){ 
    //Check sizes 
    //... 

    //Call GetArg over pack 
    int retCodes[] = { GetArgValue(keys,values)...};//not possible 

    //... 
    return 0; 
} 

は、パックと一緒に配列またはベクトルを拡大することが可能ですか?そうでない場合、このユースケースに適したアプローチは何ですか?

double arg1; 
int arg2; 
std::string arg3; 
GetArgValues({"firstArg","secondArg","thirdArg"},arg1,arg2,arg3); 

またはより良い(可能であれば):例は明らかである

GetArgValues({"firstArg",arg1}, {"secondArg",arg2}, {"thirdArg", arg3}); 

願って 私が最後に達成したいことは以下の通りです。 ありがとうございます。

+0

#1 http://coliru.stacked-crooked.com/a/d0f1aec11b820582 –

+0

'{ "firstArg"、ARG1}'推定タイプではありません、 'std :: make_pair(" firstArg "、arg1)'オプション[Demo](http://coliru.stacked-crooked.com/a/d7aed99507f9aaa4)になります。 (もう1つの方法は、 'GetArgValues(" firstArg "、arg1、" secondArg "、arg2、" thirdArg "、arg3);') – Jarod42

+0

[Demo](http://coliru.stacked-crooked.com/a/ d1a68f2b8431ac8c)を使用してください。 – Jarod42

答えて

3

これにはstd::index_sequenceを使用できます。これはC++ 14ですが、必要に応じてC++ 11の実装がたくさんあります。その後GetArgValuesからインデックスを、その関数を呼び出し、生成

template<typename ... Tn, std::size_t... Idx> 
int GetArgValuesHelp(std::index_sequence<Idx...>, 
        std::vector<std::string> keys, 
        Tn&... values){ 
    int retCodes[] = { GetArgValue(keys[Idx],values)...}; 

    return 0; 
} 

template<typename ... Tn> 
int GetArgValues(std::vector<std::string> keys, Tn&... values){ 
    //Check sizes 
    //... 

    return GetArgValuesHelp(std::index_sequence_for<Tn...>{}, keys, values...); 
} 

は、我々は持つベクトルにアクセスするためのインデックスのコンパイル時に生成さシーケンスを受信するヘルパー関数を作ります

Live Demo

関連する問題