¿Cómo imprimo los argumentos de una función usando una plantilla variadic?

Este ejemplo utiliza una plantilla y función variad común. Quiero imprimir los argumentos pasados ​​af:

#include <iostream>

template <typename T>
void print(T t) {
   std::cout << t << std::endl;
}

template <typename...T>
void f(T &&...args) {
   print(args...);
   f(args...);
}

int main() {

    f(2, 1, 4, 3, 5);

}

Pero estoy recibiendo los siguientes errores:

Recopilación terminada con errores:
source.cpp: En la instanciación de 'void f(T ...) [conT = {int, int, int, int, int}] ':
source.cpp: 16: 20: requerido desde aquí
source.cpp: 10: 4: error: no hay una función coincidente para llamar a 'print(int&, int&, int&, int&, int&)'
source.cpp: 10: 4: nota: el candidato es:
source.cpp: 4: 6: nota:template<class T> void print(T)
source.cpp: 4: 6: nota: la deducción / sustitución del argumento de la plantilla falló: source.cpp: 10: 4: nota: el candidato espera 1 argumento, 5 siempre

Esta es realmente la primera vez que uso funciones variadicas y no entiendo exactamente cómo usarlas bien. Tampoco entiendo por qué esto no funciona y qué puedo hacer para ayudarlo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta