变分模板递归构造函数问题

Variadic template recursive constructor problems

本文关键字:构造函数 问题 递归      更新时间:2023-10-16

我试图理解使用可变模板的递归构造函数。

在下面的代码中,我想实现一个具有可变传递值的递归构造函数。

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...>

并初始化初始化列表中的继承类(在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接收到至少一种类型时,选择专用化;当接收到零类型时,只有主版本匹配并作为基本情况。