[英]How to initialize a std::vector from variadic templates with different type each?
My main problem is that i'm trying to create a function that initialize a std::vector
of a class that can be initialized by different ways, so I decided to use variadic templates, but, like in this example, that does not compile:我的主要问题是我正在尝试创建一个 function 来初始化可以通过不同方式初始化的 class 的
std::vector
,所以我决定使用可变参数模板,但是,就像在这个例子中一样,它不会编译:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct MyClass {
MyClass(int v): value(v){}
MyClass(string v): value(stoi(v)){}
int value;
};
template<typename ...Args> vector<MyClass> mc_vector(const Args &...args);
int main()
{
auto vec = mc_vector(1, "3", 5);
for (auto &i : vec)
cout << i.value << " ";
cout << endl;
}
template<typename ...Args, typename T> void mc_vector_(vector<MyClass>& vec, const Args &...args, const T& t) {
vec.emplace_back(t);
mc_vector_(vec, args...);
}
template<typename ...Args> vector<MyClass> mc_vector(const Args &...args) {
vector<MyClass> vec;
vec.reserve(sizeof...(args));
mc_vector_(vec, args...);
return vec;
}
And actually, i would like to know if you image a smarter way of doing this.实际上,我想知道您是否想像一种更聪明的方式来做到这一点。
You need to put the variadic argument last and you could use a fold-expression to populate vec
.您需要将可变参数放在最后,您可以使用折叠表达式来填充
vec
。 You could also make it do perfect forwarding :你也可以让它做完美的转发:
#include <utility> // std::forward
template<typename... Args, typename T>
void mc_vector_(vector<MyClass>& vec, T&& t, Args&&... args) {
vec.emplace_back(std::forward<T>(t));
(mc_vector_(vec, std::forward<Args>(args)), ...); // fold-expression
}
template<typename ...Args>
vector<MyClass> mc_vector(Args&&... args) {
vector<MyClass> vec;
vec.reserve(sizeof...(args));
mc_vector_(vec, std::forward<Args>(args)...);
return vec;
}
The top function could be simplified to:顶部的 function 可以简化为:
template<typename... Args>
void mc_vector_(vector<MyClass>& vec, Args&&... args) {
(vec.emplace_back(std::forward<Args>(args)), ...); // fold-expression
}
If you really want a recursive call:如果你真的想要一个递归调用:
template<typename... Args, typename T>
void mc_vector_(vector<MyClass>& vec, T&& t, Args&&... args) {
vec.emplace_back(std::forward<T>(t));
if constexpr (sizeof...(Args) > 0) mc_vector_(vec, std::forward<Args>(args)...);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.