Kann ich variadische Vorlagen verwenden, ohne die Vorlagenparameter als Funktionsparameter zu verwenden?Variadic-Vorlagen ohne Funktionsparameter
Als ich sie verwenden, es kompiliert:
#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);
}
Aber wenn ich sie nicht verwenden, es nicht kompilieren und beschwert sich über eine Zweideutigkeit:
#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>();
}
Leider sind die Klassen I wollen als Vorlage geben Parameter sind nicht instanziierbar (sie haben statische Funktionen, die innerhalb der Template-Funktion genannt werden). Gibt es eine Möglichkeit, dies zu tun?
Wenn Sie eine * unevaluierten * Ausdruck eines bestimmten Typs benötigen, können Sie 'std :: declval()'. Funktioniert für jedes "T", unabhängig davon, ob es konstruierbar ist oder nicht. –
Warum funktioniert die No-Argument-Version nicht: Ohne Argumente sind die beiden Überladungen 'print' und 'print ' gleich gut, während mit 'print (3)' eine bessere Übereinstimmung als 'print ist (3, {}) '(wobei' {} '" nichts "bedeutet). Keine Überladung, wie CatPusPus nahelegt, ist die Standardmethode; und da Sie Ihre Argumente sowieso nicht ableiten, ist das die einfachste Lösung. –
Ich wollte eine Antwort posten, aber n.m. habe es schon gepostet. – bames53