Ich habe den folgenden Code:
%Vor%Ich habe 2 Fragen:
1.
Ich verstehe nicht, warum die Zeile func<void, double>(f);
mir einen Kompilierungsfehler gibt
Dagegen funktioniert es, wenn ich den Parameter f
auf ein std::function
(wie in der nicht-kommentierten Zeile) umwandle.
2.
Und das rätselhafteste Problem ist, dass, wenn ich eine nicht-variadische Version von func
verwende (also nur typename...
durch typename
ersetzen, so dass func
einen std::function<Return(Params)>
als Parameter akzeptiert), dann die kommentierte Zeile in main
funktioniert wie gewünscht. Irgendwelche Ideen warum?
Ich verstehe nicht, warum die Zeile
func<void, double>(f);
mir einen Kompilierungsfehler gibt
Der Compiler weiß nicht, dass Params
genau double
sein soll. Er denkt vielleicht, dass er ein Paket mit mehr Elementen wie double, int, void*, char
oder% ableiten möchte. co_de% oder irgendein anderes Paket von Typen, und es kann nicht aus dem Argument double, double, double
abgeleitet werden.
Theoretisch könnte es andere Spezialisierungen von f
geben, die aus std::function
konstruiert werden könnten und die es dem Compiler erlauben würden, ein Paket von mehr als einem Typ für f
abzuleiten (es kann nicht wissen, dass es nicht ist) t true, ohne jede mögliche Spezialisierung von Params
zu instanziieren und zu testen, was nicht machbar ist.
Dagegen funktioniert es, wenn ich den Parameter
std::function
auf einf
(wie in der nicht-kommentierten Zeile) umsetze.
Weil der Compiler nun std::function
korrekt ableiten kann.
Und das Rätselhafteste ist, dass, wenn ich eine nicht-variadische Version von
Params
[...] verwende, die kommentierte Zeile in main wie gewünscht funktioniert. Irgendwelche Ideen warum?
Weil der Compiler jetzt weiß, dass func
ein einzelner Typ ist, kein Paket von null oder mehr Typen. Wenn Sie also Params
sagen, weiß func<void, double>
ist Params
und nicht double
oder einige anderes Parameterpaket.
Bearbeiten als Antwort auf Ihren Kommentar, beachten Sie Folgendes:
%Vor%Ich habe nur ein explizites Template-Argument für zwei der Parameter angegeben, also muss der dritte immer noch abgeleitet werden.
Wenn Sie eine variadische Vorlage haben, könnte eine beliebige Anzahl anderer Parameter sein, die noch abgeleitet werden müssen.
Tags und Links c++ c++11 templates variadic-templates