Ich möchte ein std::function
ähnliches Objekt erstellen, das mehr als eine Überladung speichern kann.
Syntax sort wie folgt: my_function< int(double, int), double(double, double), char(int, int) >
.
Oder expliziter:
%Vor% Meine Frage: Wie soll ich pick_overload_signatures
schreiben?
Hier ist die Arbeit, die ich damit gemacht habe:
Meine Neigung wäre, eine partielle Reihenfolge von Funktionssignaturen in Bezug auf eine gegebene Menge von Argumenten zu schreiben, dann die Typliste von Funktionssignaturen zu sortieren und dann die beste zu nehmen (mit möglicherweise einer Kompilierungszeitbestätigung, dass die beste ist) einzigartig). Um das zu erreichen, müsste ich eine solide Teilaufgabe (in Bezug auf eine Reihe von übergebenen Argumenten) auf Funktionssignaturen haben ...
13.3.3.1 sagt mir, wie man feststellen kann, ob es eine gültige Konvertierung gibt. Ich kann dafür schummeln, indem ich den Compiler verwende, um eine Konvertierung für mich durchzuführen, und SFINAE verwenden, um zu erkennen, ob es für ein gegebenes übergebenes Argument und die Signatur einer der "Überladungen" aufgetreten ist.
13.3.3.2 sagt mir, wie man diese Konvertierungen bestellt. Hier muss ich erkennen, ob eine Konvertierungssequenz benutzerdefiniert oder eine Standardsequenz ist. Ich bin nicht sicher, wie man zwischen den zwei unterscheidet.
Vielleicht kann ich die Traits-Klasse verwenden, um die Existenz von benutzerdefinierten Konvertierungssequenzen zu erkennen. Überprüfen Sie, ob &S::operator D()
und &D::D(S const&)
und &D::D(S)
und &D::D(S&&)
oder etwas ähnliches vorhanden sind.
has_user_defined_conversion<S,D>::value
, has_standard_conversion<S,D>::value
usw.?
Wird dieser Ansatz funktionieren, hat jemand das bereits getan oder hat jemand schon Teile davon gemacht?
%Vor%Ist nicht fertig, aber nutzbar.
Danke allen!
Ich denke, Sie können etwas wie diese Eigenschaften verwenden ... Aber wenn Sie die Auflösung wie im Standard überladen wollen, brauchen Sie mehr Code Ссылка
%Vor%und implementieren, was Sie wollen: Überprüfen Sie zunächst, ob die Signaturen standard_konvertierbar sind Wenn nicht, überprüfen Sie, ob die Signatur benutzer_konvertierbar ist.
Tags und Links c++ c++11 templates overload-resolution