Variadic шаблон рекурсивных конструкторских задач - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь понять, как использовать рекурсивные конструкторы с переменными шаблонами.

В следующем коде я хочу реализовать рекурсивный конструктор с переданными переменными значениями.

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
}

1 Ответ

2 голосов
/ 06 ноября 2019

Вы также должны наследовать от 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 получает хотя бы один тип, специализация выбирается;при получении нулевого типа только основная версия совпадает и служит наземным регистром.

...