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?
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.
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.
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:
Siehe diese Antwort auf eine weitere SO-Frage für weitere Informationen zum Thema.