Wie finde ich die Anzahl der Argumente, die eine Template-Funktion benötigt?

8

Ich habe folgende Typeigenschaft:

%Vor%

Es ist sehr hilfreich, die Anzahl der Argumente zu finden, die eine Funktion für die meisten Anwendungsfälle benötigt, aber es schlägt für einen häufigen Fall fehl:

%Vor%

Ich glaube, dass es im Allgemeinen nicht möglich ist, dies für jede Template-Funktion / Operator () zu tun, da abhängig von den als Template-Typen übergebenen Typen / Werten eine andere Überladung gewählt werden kann oder vielleicht überhaupt keine Überladung verfügbar ist. Außerdem gibt es keine Möglichkeit zu wissen, welche gültigen Typen und Werte als Vorlagenargumente übergeben werden sollen. Dennoch möchte ich, dass dies für den allgemeinen Fall eines Lambda funktioniert, der auto Argumente verwendet. Gibt es eine Möglichkeit, dies robuster zu machen und Lambda abzudecken, die automatische Argumente annimmt?

    
David 09.01.2017, 20:57
quelle

2 Antworten

4

Ich denke, ich habe hier eine halbe Lösung erreicht. Funktioniert nur bis zu einer festen Anzahl von Parametern, aber für die meisten Anwendungen sollte das kein Problem sein. Auch ist es wahrscheinlich sehr vereinfacht, aber mein Gehirn ist jetzt nicht in knifflige SFINAE.

%Vor%

CanCall<F, N> gibt zurück, ob F mit N -Parametern beliebigen Typs aufgerufen werden kann. Der Helper-Typ Any enthält implizite implizite Konvertierungsoperatoren, mit denen er in jeden gewünschten Parametertyp morphen kann.

%Vor%

Arity<F> überprüft nur, ob ein F mit null, eins, zwei ... Parametern aufgerufen werden kann. Erster positiver Check gewinnt. Wenn wir MAX_ARITY_PROBING -Parameter erreichen, bricht Arity ab und nimmt an, dass die Funktion entweder variadisch oder gar keine Funktion ist.

Sieh es live auf Coliru

    
Quentin 09.01.2017, 22:21
quelle
2

Ich glaube nicht, dass Sie in Ihrem Anwendungsfall Lambda-Funktionen verwenden können, deren Argumenttypen auto sind. Die operator() -Funktionen solcher Lambda-Funktionen werden höchstwahrscheinlich mithilfe von Funktionsvorlagen implementiert.

Daher kann decltype nicht mit:

verwendet werden %Vor%

Siehe diese Antwort auf eine weitere SO-Frage für weitere Informationen zum Thema.

    
R Sahu 09.01.2017 21:12
quelle

Tags und Links