2016-07-19 10 views
2

Ist diese Statistik sinnvoll? FÜR DIESE EXPLIZITE FALL?Macht ein static_cast bei einer getInt() - Funktion Sinn?

QSqlQuery q; 
enum MyEnumType; 
obj.setMyEnumType(static_cast<MyEnumType>(q.value(2).toInt())); 

oder ist eine statische Besetzung für Situationen, in denen der Quelltyp nicht sicher int ist?

die eingestellte Funktion ist

void setMyEnumType(MyEnumTypetype type) { m_type = type; } 

was ist der Vorteil einer einfachen Guss?

obj.setMyEnumType((MyEnumType)q.value(2).toInt()); 
+0

ja es tut, denn ohne sie wird dieser Code zu kompilieren – Slava

+0

scheitern @slava Sie es accepty Enum Recht, sondern kompiliert auch ohne static_cast – wutzebaer

+0

ohne static_cast meinst du dein Beispiel mit C-Style-Besetzung? Ja, das würde kompilieren, aber Sie haben gerade einen Cast durch einen anderen ersetzt. – Slava

Antwort

1

Es macht durchaus Sinn von int zu einem enum und zurück zu konvertieren. Sie könnten nach Randbedingungen suchen (z. B. int ist größer als das letzte Element von enum). Beachten Sie, dass Sie die Funktion nicht hier ausgeben, sondern den Rückgabewert.

+0

macht static_cast automatisch eine Grenzkontrolle? – wutzebaer

+0

@wutzebaer Nein, tut es nicht. – user975989

+0

also was ist der vorteil der static_cast in diesem fall? – wutzebaer

3

Ja die Besetzung macht Sinn. Lassen Sie uns unpick dies ein wenig mehr:

QSqlQuery q; 
enum MyEnumType; 
const auto v1 = q.value(2); // I don't know what the type of v1 will be. 
          // See the QSqlQuery docs. 
const auto v2 = v1.toInt(); // v2 is going to be an int or a long or something. 

obj.setMyEnumType(v2);  // Error: setMyEnumType doesn't take an int argument. 

const auto e = static_cast<MyEnumType>(v2); 
obj.setMyEnumType(e);  // OK. Argument is now the right type. 

Edit: Ah-ha! Ich sehe jetzt, dass Sie eine ganz andere Frage gestellt haben. Die Frage, die du wirklich gestellt hast, ist ein Duplikat von What is the difference between static_cast<> and C style casting?

Immer bevorzugen static_cast, weil a) ein Code-Überprüfer aufgefordert wird zu denken, "was passiert, wenn der Wert außerhalb des Bereichs liegt?"; b) ein Code-Reviewer wird nicht muss denken "ist das ein static_cast, ein reinterpret cast, ein Constcast oder eine Kombination aus allen dreien - und ist es sicher?"

+0

natürlich, aber in meinem Fall ist der Quellentyp klar – wutzebaer

+0

@wutzebaer: Ich verstehe Ihren Kommentar nicht. Ich habe gerade den einzelnen Ausdruck, der das Argument zu "setMyEnumType" ausgewertet hat, in mehrere Ausdrücke aufgeteilt und die Zwischenwerte in benannten Variablen gespeichert. –

1

Ihre Frage ist in diesem Szenario ein kleines XY-Problem, da QVariant integrierte Konvertierung Sicherheitsprüfungen und Casting bietet.

Verwenden qvariant_cast oder QVariant::value<>() neben canConvert(), zB:

QVariant v = q.value(2); 
if (v.canConvert<MyEnumType>()) { 
    obj.setEnumType(qvariant_cast<MyEnumType>(v)); 
    ... 
}