可变参数模板递归构造函数问题

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收到至少一种类型时,选择专精;当收到零类型时,只有主版本匹配并作为基础案例。