¿Puedo usar plantillas variadic sin usar los parámetros de plantilla como parámetros de función?Plantillas variables sin los parámetros de función
Cuando los utilizo, que compila:
#include <iostream>
using namespace std;
template<class First>
void print(First first)
{
cout << 1 << endl;
}
template<class First, class ... Rest>
void print(First first, Rest ...rest)
{
cout << 1 << endl;
print<Rest...>(rest...);
}
int main()
{
print<int,int,int>(1,2,3);
}
Pero cuando no los uso, no compila y se queja de una ambigüedad:
#include <iostream>
using namespace std;
template<class First>
void print()
{
cout << 1 << endl;
}
template<class First, class ... Rest>
void print()
{
cout << 1 << endl;
print<Rest...>();
}
int main()
{
print<int,int,int>();
}
Desafortunadamente las clases I Quiero dar como parámetros de plantilla no son instanciables (tienen funciones estáticas que se llaman dentro de la función de plantilla). ¿Hay alguna manera de hacer esto?
Si necesita un * * expresión sin evaluar de un tipo determinado, se puede usar 'std :: declval()'. Funciona para cualquier 'T', sea o no constructible. –
En cuanto a por qué la versión sin argumento no funciona: Sin argumentos, ambas sobrecargas 'imprimir' e 'imprimir ' son igualmente buenas, mientras que con argumentos 'imprimir (3)' es una mejor coincidencia que 'imprimir (3, {}) '(donde' {} 'significa" nada "). No utilizar sobrecargas, como sugiere CatPusPus, es el método estándar; y como no deduces tus argumentos de todos modos, es la solución más simple. –
Iba a publicar una respuesta, pero n.m. ya publicado. – bames53