Ternäre Operator- und Funktionssignatur

8

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 ?

    
Yannick Blondeau 24.10.2012, 13:21
quelle

4 Antworten

21

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:

%Vor%     
Pete Becker 24.10.2012, 13:23
quelle
7

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.)

    
Kerrek SB 24.10.2012 13:23
quelle
5

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.

    
R. Martinho Fernandes 24.10.2012 13:23
quelle
5

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%     
CashCow 24.10.2012 13:23
quelle