Nehmen wir an, ich habe eine C ++ Klasse mit zwei Funktionen wie
%Vor%Ist es möglich, den ternären Operator wie folgt zu verwenden?
%Vor% und haben eine andere Funktion von MyClass
aufgerufen abhängig von dem Wert von booleanValue
?
Nicht mit dem ternären Operator. Der Typ eines ternären Ausdrucks ist der gemeinsame Typ seines zweiten und dritten Operanden; Wenn sie keinen gemeinsamen Typ haben, können Sie sie nicht verwenden. Verwenden Sie einfach eine gewöhnliche if
-Anweisung:
Der Typ eines ternären Bedingungsausdrucks ist der allgemeine Typ zwei, bei dem beide Operanden konvertierbar sind. Sie können definitiv nicht "dynamische Überladungsauflösung" durchführen, wie Sie vermuten.
Da es für int
und char const *
keinen gemeinsamen Typ gibt, wird der Code nicht einmal kompiliert (wie Sie sicherlich beim Testen festgestellt haben).
(Sie können begeistert sein zu wissen, dass die ternäre Bedingung gerade wegen dieser Semantik in der Implementierung der Klassenvorlage std::common_type
zusammen mit decltype
verwendet wird.)
(Wenn die Bedingung statisch bekannt ist, z. B. sizeof(int) != 7
, können Sie die Vorlagenspezialisierung verwenden, um ähnlich aussehenden Code zu schreiben, der eine bedingte Überladungsauflösung durchführt. aber natürlich statisch.)
Nein. Um eine Überladungsauflösung durchzuführen, fragt der Compiler nach "Was ist der Typ von booleanValue?24:"a string"
?". Diese Frage kann nicht beantwortet werden.
Nein, das ist nicht erlaubt.
Überladungen sind Kompilierzeit, so dass sie in der Laufzeit nicht funktionieren.
Im Code ist es nicht üblich, dass Sie genau das machen möchten, aber manchmal mit iostream gibt es den Wunsch etwas zu tun wie:
os << ( condition ? var1 : var2 )
wobei var1 und var2 unterschiedliche Typen haben. Das funktioniert auch nicht.
Sie könnten tun:
%Vor%Tags und Links c++ function-signature ternary-operator