我有很多的功能非常相似,但與當地對象的不同數量和類型上運行:如何遍歷可變參數模板參數以創建可變數量的局部變量?
template <class T> T* create1(const std::vector<std::string>& names)
{
A a(names[0]);
B b(names[1]);
C c(names[2]);
if (a.valid() && b.valid() && c.valid())
return new T(a, b, c);
else
return NULL;
}
template <class T> T* create2(const std::vector<std::string>& names)
{
D d(names[0]);
E e(names[1]);
if (d.valid() && e.valid())
return new T(d, e);
else
return NULL;
}
create1<ABC>({ "nameA", "nameB", "nameC" });
create2<DE>({ "nameD", "nameE" });
會可變參數模板幫助我實現這些功能,因爲這一個重構?
template <class T, typename Args...> T* create()
{
// loop over Args and create 2 or 3 objects
// if (....valid())
// return T(...);
// else
// return NULL;
}
create<ABC,A,B,C>({ "nameA", "nameB", "nameC" });
create<DE,D,E>({ "nameD", "nameE" });
經過How can I iterate over a packed variadic template argument list?和iterating over variadic template's type parameters沒有成功。看不到我怎麼能創建一個可變數量的不同類型的本地對象...
他們*需要*是本地對象嗎?或者臨時工好嗎? – Rakete1111
如果可能,我寧願選擇本地,因爲實際上它們的創建可能會失敗,然後導致函數的提前返回。更新了帖子。 – jpo38
爲什麼不檢查向量名稱的大小並執行if語句?你只能用一個函數完成所有這些。這不是可變模板的目的。也許你想使用[cstdarg](http://www.cplusplus.com/reference/cstdarg/)? – Stargateur