[英]Variadic template recursive constructor problems
我試圖了解遞歸構造函數與可變參數模板的使用。
在下面的代碼中,我想實現一個帶有可變參數傳遞值的遞歸構造函數。
template <class T, class... T2>
struct Tuple{
T value;
Tuple(T n){ //constructor if only one value left
value = n;
}
Tuple(T n, T2... re){ //constructor if more than one value left
T value = n;
//Tuple(rest...); doesnt work for me
}
};
int main(){
Tuple<int, float, int> t(2, 1.2, 9);
std::cout << t.value << "\n"; //2
std::cout << t.rest.value << "\n"; //1.2
std::cout << t.rest.rest.value << "\n"; //9
}
您還必須從Tuple<T2...>
繼承
template <class T, class... T2>
struct Tuple : public Tuple<T2...>
並在初始化列表中初始化繼承的 class(在value
之前)[警告代碼未測試]
Tuple(T n, T2... re) : Tuple<T2...>{re...}, value{n}
{ }
您還需要基礎案例專業化來停止遞歸
某事作為
template <class T>
struct Tuple<T>
{
T value;
Tuple (T n) : value{n}
{ }
};
或者也(也許更簡單)
template <>
struct Tuple<>
{ };
但是對於第二種解決方案,您必須將Tuple
定義為接收零個或多個類型; 也許如下
template <typename...>
struct Tuple
{ };
template <class T, class... T2>
struct Tuple<T, T2...> : public Tuple<T2...>
{
// ...
};
這樣,當Tuple
接收到至少一種類型時,就選擇了專業化; 當接收零類型時,只有主版本匹配並用作地面案例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.