variadic Vorlagen Parameterabgleich in std :: -Funktion

8

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

%Vor%

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?

    
vsoftco 27.05.2014, 22:34
quelle

1 Antwort

11
  

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 ein f (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.

    
Jonathan Wakely 27.05.2014, 22:41
quelle