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 foo
float
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.
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. –