Ich fühle mich ein wenig unwohl im Moment, wenn ich Parameterpacks verwende. Ich habe eine Funktion bekamWie behandelt man Parameterpakete in der Mitte einer Funktionssignatur?
template <class ... Args>
void f(int x, Args ... args, int y)
{}
und natürlich mit es wie folgt funktioniert:
f(5, 3);
Ich frage mich, warum der folgende Aufruf fehlschlägt:
f(5, 3.f, 3);
Es scheint wie eine gerade -forward Verwendung von Parameter-Packs zu mir, aber nach dem Compiler Args
ist nicht erweitert.
Natürlich könnte ich leicht ersetzen f
durch:
template <class ... Args>
void f(int x, Args ... args)
{
static_assert(sizeof...(args) >= 1, ...);
extract y from args ...
}
Fragen:
Warum kann ich Parameter Packs wie diese verwenden? Es sieht so aus, als ob der Compiler den Ersetzungscode leicht erstellen könnte. Oder gibt es Probleme mit dem Ersatz
f()
oben?Was ist der beste Weg, um damit umzugehen, wenn die Reihenfolge der Parameter wirklich wichtig für mich ist? (Denken Sie an
std::transform
für eine beliebige Anzahl von Eingabe-Iteratoren.)Warum ist die Verwendung von Parameterpaketen in der obigen Situation nicht verboten? Ich nehme an, es ist, weil sie explizit, z.
f<float>(5, 3.f, 3)
?
Danke, dass Sie mich in diesem Fall auf SFINAE aufmerksam gemacht haben. Ich bin mir ziemlich sicher, dass ich eine Lösung finden könnte, die die meisten Fälle korrekt behandelt, aber jetzt bin ich mir auch sicher, dass es sich nicht lohnt (in meiner Situation). –