我的头文件包含如下所示的结构:
#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?
答案 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
来完成此操作。