我的主要問題是我正在嘗試創建一個函式來初始化一個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;
}
實際上,我想知道您是否想象了一種更智能的方式來做到這一點。
uj5u.com熱心網友回復:
您需要將可變引數引數放在最后,并且可以使用折疊運算式來填充vec. 你也可以讓它做完美的轉發:
#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;
}
top函式可以簡化為:
template<typename... Args>
void mc_vector_(vector<MyClass>& vec, Args&&... args) {
(vec.emplace_back(std::forward<Args>(args)), ...); // fold-expression
}
如果你真的想要一個遞回呼叫:
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)...);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380295.html
上一篇:專業化不包含在主模板中宣告的資料
