Datentypen wandeln
-
Wie wandle ich denn korrekt in andere Datentypen um. Zum Beispiel von int nach short.
Bei implizieter Umwandlung erhalte ich eine Warnung:
Konvertierung von 'int' in 'short', möglicher Datenverlust.
Was ja auch richtig ist.
Bei explizieter Umwandlung mach ich das dem Compiler ja klar dass mir das bewußt ist und ich dieses in kauf nehme.
Andernfalls muss ich überprüfen ob sich der Wert im richtigen Bereich befindet und gegebenenfalls eine Fehler ausgeben. (Gibt es da schon fertige Klassen?)
Was mich aber noch mehr interessiert wie mache ich das bei Template Klassen.
Beispiel: Ich erzeuge ein Objekt einer Templateklasse vom Typ short. Nun gibt es eine Funktion SetValue(T value) der übergebe ich einen int. Am besten der Code zum besseren Verständnis:
template<class T> class CMyClass { void SetValue( T value ) { m_value = value; } T m_value; }; int main { int i = 5; CMyClass<short> my; my.SetValue(5); }
In was muss ich hier casten? In T? Und wie überprüfe ich den Wertebereich?
-
template<class T> class CMyClass { void SetValue( T value ) { m_value = value; } T m_value; }; int main { int i = 5; CMyClass<short> my; my.SetValue(5); }
Hier brauchst gar nichts casten, da du my.SetValue(5) anstatt my.SetValue(i) schreibst. Und 5 kann von einem short gespeichert werden.
Konvertierung von 'int' in 'short', möglicher Datenverlust.
Hierbei handelt es sich um eine Warnung des Compilers das es zu solch einem Datenverlust kommen kann. Wenn du aber sicherstellen kannst das du deinen int zu jederzeit in einen short pressen kannst, dann müsstest du folgendes machen um diese Warnung los zu werden.
int main { int i = 5; CMyClass<short> my; my.SetValue(static_cast<short>(i)); }
P.S.: Dies ist eine allgemeine C++ Frage und keine die mit der MFC zu tun hat.
-
Muss das mit static cast gemacht werden?
Ich mach es immer so:my.SetValue(short(i));
Und weg sind die Warnungen.
-
Na super.
Lest ihr überhaupt das was ich schreibe. Also da fällt mir echt nichts mehr ein.
Habe ich nicht geschrieben dass ich weiß wie ich die Warnungen wegbekomme:Doch:
Bei explizieter Umwandlung mach ich das dem Compiler ja klar dass mir das bewußt ist und ich dieses in kauf nehme.
Habe ich gefragt was die Fehlermeldung bedeutet: Nein.
Wenn ich caste ist ein Datenverlust immer noch möglich. Dass dies nicht passiert muss überprüft werden ob der übergebene int im Bereich eines short liegt.
Und das war meine Frage: Gibt es hier fertige Klassen und wie geht das bei Templateklassen.
-
Nana, interpretiere hier nichts aus heiterem Himmel.
"Ihr" stimmt ja wohl überhaupt nicht, schliesslich hat dir nur C++!=MFC freundlicherweise geantwortet. Ich wollte nur etwas von ihm wissen ...
Davon abgesehen war/ist die Frage im falschen Forum.
Und nun ist sie o.T.
-
y-vonne schrieb:
Und das war meine Frage: Gibt es hier fertige Klassen und wie geht das bei Templateklassen.
boost::numeric_cast
Boost Doku schrieb:
numeric_cast returns the result of converting a value of type Source to a value of type Target. If out-of-range is detected, an exception is thrown (see bad_numeric_cast, negative_overflow and positive_overflow ).
-
Hallo.
Da bleibt mir nur noch die Antwort: Vielen Dank.