【问题标题】:How to expand vectors or arrays in variadic parameter pack?如何在可变参数包中扩展向量或数组?
【发布时间】:2016-07-25 06:02:48
【问题描述】:

我想在可变参数模板包中扩展数组或向量。 考虑以下示例:

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

希望这个例子很清楚。 谢谢大家的建议。

【问题讨论】:

  • {"firstArg", arg1} 不是推导类型,std::make_pair("firstArg", arg1) 将是一个选项Demo。 (另一种选择是:GetArgValues( "firstArg", arg1, "secondArg", arg2, "thirdArg", arg3);
  • Demo 最后一个选项。
  • 您想将字符串转换为类型化参数吗?
  • @Galik:无需转换字符串。字符串 args 在内部用作从列表中查找参数对象的键。

标签: c++ variadic-templates


【解决方案1】:

您可以为此使用std::index_sequence。请注意,这是 C++14,但如果需要,还有很多 C++11 的实现。

我们创建了一个辅助函数,它将接收编译时生成的索引序列以访问向量:

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

然后调用该函数并从GetArgValues 生成索引:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多