如何将字符串向量emplace_back转换为struct类型的向量?

时间:2017-07-30 18:35:07

标签: c++ vector struct

我的头文件包含如下所示的结构:

#include <iostream>
#include <vector>
#include <string>

struct Fields {
  std::string f_name, l_name, id;
  Fields (std::string fn,
          std::string ln,
          std::string i): f_name{fn},
    l_name{ln}, id{i} {
  }
};

并且主程序包含字符串向量“values”,其实际上包含从文件中提取的字符串

#include "my_header.h"

int main() {

   std::vector <std::string> values = {"xyz", "p", "30"}; //have given values to it as example
   static vector<Fields> field_values;
   for (uint32_t vl=0; vl<values.size(); vl++){
     field_values.emplace_back(values[vl]);

   }

return 0;
}

但上面的代码给出了一个错误:

  

错误:没有匹配的调用功能   'Fields :: Fields(std :: basic_string&amp;)'{:: new((void *)__ p)   _up(标准::向前&LT; _args&GT;(__参数)...); }       ^

然而,当我在不使用for循环的情况下将各个值赋给emplace_back时,没有错误

field_values.emplace_back(values[0], values[1], values[2]); //gives no error

如何在我的代码中一次一个地对值进行emplace_back?

1 个答案:

答案 0 :(得分:1)

Fields的构造函数有3个参数。您拨打emplace_back的电话提供了一个。 emplace并不神奇地知道您将在以后提供更多参数。它根据您在该调用中提供的参数构造对象。

你不能做你想要做的事情:循环容器的元素并将这些元素作为一系列构造函数参数传递。或者至少,你不能用for循环来做。

可以使用std::index_sequence使用一些元编程和C ++ 14体操:

#include <utility>

template<typename T, typename U, size_t ...Ints>
void emplace_from_params(T &t, const U &u, std::index_sequence<Ints...>)
{
  t.emplace_back(u[Ints]...);
}

int main()
{
   std::vector <std::string> values = {"xyz", "p", "30"}; //have given values to it as example
   vector<Fields> field_values;

   emplace_from_params(field_values, values, std::make_index_sequence<3>{});
}

然而,这是静态的。您无法通过动态将values.size()传递给make_index_sequence来完成此操作。