Überladungsauflösung "manuelle" Signatur

8

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?

Ergebnis der Antworten

%Vor%

Ist nicht fertig, aber nutzbar.

Danke allen!

    
Yakk 20.02.2013, 05:33
quelle

2 Antworten

4

Ich bin mir sicher, dass es auf Ihre Art machbar ist, aber vielleicht werden Sie mit dieser Person zufrieden sein Ссылка

%Vor%     
pal 20.02.2013, 12:31
quelle
1

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.

    
ForEveR 20.02.2013 08:26
quelle