Czy mogę używać szablonów variadic bez użycia parametrów szablonu jako parametrów funkcji?Szablony Variadic bez parametrów funkcji
Kiedy ich używać, to kompiluje:
#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);
}
Ale kiedy z nich nie korzysta, to nie kompiluje i narzeka dwuznaczności:
#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>();
}
niestety klas I chcesz podać jako parametry szablonu nie są dostępne (mają statyczne funkcje, które są wywoływane wewnątrz funkcji szablonu). Czy jest jakiś sposób na zrobienie tego?
Jeśli potrzebujesz * unevaluated * ekspresję danego typu, można użyć 'std :: declval()'. Działa dla dowolnego 'T', niezależnie od tego, czy jest ono możliwe do skonstruowania. –
Co do tego, dlaczego wersja bezargumentowa nie działa: Bez argumentów, oba przeciążenia 'print' i 'print ' są równie dobre, natomiast z argumentami 'print (3)' jest lepiej dopasowany niż 'print (3, {}) '(gdzie' {} 'oznacza" nic "). Nie stosowanie przeciążeń, jak sugeruje CatPusPus, jest standardową metodą; a ponieważ nie wyprowadzacie swoich argumentów, to jest to najprostsze rozwiązanie. –
Zamierzałem wysłać odpowiedź, ale n.m. już to opublikował. – bames53