2017-01-02 12 views
1

Ist es möglich foo von Float in Long zu konvertieren (und umgekehrt)?C++ 11 automatisch. convert from float to long

auto foo = float(1234567891234.1234); 
cout << "foo: " << foo << endl; 

foo = long(1234567891234.1234); 
cout << "foo: " << foo << endl; 

Der Ausgang ist immer:

foo: 1.23457e+12 
foo: 1.23457e+12
+0

Dies ist nicht das Problem, aber verwenden Sie nicht 'std :: endl', es sei denn, Sie benötigen die zusätzlichen Sachen, die es tut. '\ n'' beendet eine Zeile. –

Antwort

13

Nicht so, wie Sie es geschrieben haben. Zuerst

auto foo = float(1234567891234.1234); 

verwendet Autotyp Abzugsregeln die Art der RHS zu schließen, und das Ergebnis ist float. Sobald dies erledigt ist, ist der Typ foofloat und es ist in Stein gemeißelt (C++ ist statically typed, anders als beispielsweise Python). Wenn Sie das nächste

foo = long(1234567891234.1234); 

die Art von foo schreiben ist noch float und es nicht auf magische Weise zu long geändert wird.

Wenn Sie eine „Veränderung“ emulieren vom Typ Sie eine Besetzung höchstens ausführen:

cout << "foo (as long): " << static_cast<long>(foo) << endl; 

oder verwenden Sie eine zusätzliche Variable

long foo_long = foo; // again you may have a loss of precision 

aber wegen möglicher Präzision Verlust bewusst sein, zur Gleitkommadarstellung.

Wenn Sie Zugriff auf einen C++ 17-Compiler haben, können Sie eine std::variant<long, float>, die eine typsichere Union ist, zwischen Typen wechseln. Wenn nicht, können Sie nur eine einfache alte Vereinigung verwenden wie

#include <iostream> 

union Foo 
{ 
    float f; 
    long l; 
}; 

int main() 
{ 
    Foo foo; 
    foo.f = float(1234567891234.1234); // we set up the float member 
    std::cout << "foo: " << foo.f << std::endl; 

    foo.l = long(1234567891234.1234); // we set up the long member 
    std::cout << "foo: " << foo.l << std::endl; 
} 

Live on Coliru

Oder Sie eine Typ-Löschtechnik wie

#include <iostream> 

int main() 
{ 
    void *foo; // we will store the object via this pointer 

    foo = new int{42}; 
    std::cout << *(int*)foo << '\n'; 
    operator delete(foo); // don't do delete foo, it is undefined behaviour 

    foo = new float{42.42}; 
    std::cout << *(float*)foo << '\n'; 
    operator delete(foo); // don't do delete foo, it is undefined behaviour 
} 
können

Live on Coliru

Die moderne Version des obigen Codes kann mit einem std::shared_ptr wie

01 neu geschrieben werden Typ-Löschung
#include <iostream> 
#include <memory> 

int main() 
{ 
    std::shared_ptr<void> foo{new int{42}}; 
    std::cout << *(int*)foo.get() << '\n'; 

    foo.reset(new float{42.42}); 
    std::cout << *(float*)foo.get() << '\n'; 
} 

Live on Coliru

A std::unique_ptr<void> nicht als nur std::shared_ptr implementiert arbeiten.

Natürlich, wenn Sie nicht wirklich auf Speichergröße usw., verwenden Sie nur 2 separate Variablen.

+0

Also was mache ich? – djent

+0

@djent Bearbeiten. – vsoftco

+0

Ist es möglich, dies zu tun: foo = static_cast (foo); und foo Wechsel zu einem langen Typ? Ist es möglich, das irgendwie zu tun? – djent