@IliaNeverov

Как работает эта рекурсия?

Всем добрый день. У меня есть такой код:
template <typename T>
void foo(T value) {
    return;
}
template<typename T, typename... Args>
void foo(T value, Args... arg)
{
    std::cout << sizeof(value) << " | ";
    foo(arg...);
}
int main()
{
    MyClass a;//объект какого то класса
    foo(89.8, a, 234.2,3,'a',0);
    return 0;
}

Я вызываю функцию foo в main один раз , она в свое время вызывает другую функцию foo передав туда пакет параметров которая ничего не делает и сразу прекращает свое действие. Тем временем она(foo у которой в аргументах пакет параметров ) выводит не 1 переменную из пакета параметров а все кроме последней, объясните пожалуйста почему так?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Потому что при конкретизации шаблона foo(89.8, a, 234.2,3,'a',0) у вас происходят последовательно
foo(a, 234.2,3,'a',0)
foo(234.2,3,'a',0)
foo(3,'a',0)
foo('a',0)
foo(0)

Каждая функция печатает свой первый параметр и вызывает себя же с пакетом параметров, от которого отрезан первый.

Последний вызов приходится на функцию, которая ничего не печатает, поэтому последний параметр у вас и не печатается.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
По идее в foo с одним параметром перед return нужно добавить строку:
std::cout << sizeof(value) << std::endl;
Тогда будут выводится все параметры.
Смысл рекурсии в том, что на каждом шаге выводится первый параметр и убирается из списка, обрезанный список параметров передается дальше по рекурсии. Пока параметров несколько вызывается функция со списком, когда параметр становится один (последний), вызывается foo с одним параметром и рекурсия завершается.
Сейчас у вас foo с одним параметром не выводит ничего, поэтому последний параметр как бы игнорируется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы