implizite typumwandlung
-
Hallo,
Ich habe eine klasseclass iwas { ... };Jetzt möchte ich diese Klasse so verwenden:
iwas object; int i = 1 / object;Dazu füge ich in iwas den operator int ein:
class iwas { ... operator int() { return 1; } };Dann kann ich aber noch immer nur schreiben:
iwas object; int i = 1 / int(object);also muss ich explizit casten. Ich hätte aber gerne, dass der Aufruf von operator int() implizit, also aus dem kontext heraus geschieht. Für int kann ich ja auch nicht den operator/(iwas) oder einen konstruktor int(iwas) definieren.
Versteht man, was ich sagen will?^^
-
class foo { public: foo() : i( 100 ) {} operator int() const { return i; } private: int i; }; int main() { foo bar; float i; i = 1.f / bar; std::cout << i; std::cin.get(); }Geht ohne Probleme!
-
Das schaffen die Oldtimer-Compiler (MSVC6 z.B.) nun mal nicht. Entweder was aktuelleres nehmen oder fleißig sein und casten.
-
ist minGW 3.4.2 zu alt? neueres gibt es ja nicht (auch wenn es schon GCC 4.2.0 gibt...)
-
piXelshooter schrieb:
ist minGW 3.4.2 zu alt? neueres gibt es ja nicht (auch wenn es schon GCC 4.2.0 gibt...)
doch es gibt g++ 3.4.5
-
Du kannst immer noch selbst einen Operator "/" definieren der auf einer Seite ein int nimmt und auf der anderen ein Objekt eines UDT:
class foo { int m_i; public: foo(int i) m_i(i) {} int to_int() const { return m_i; } }; int operator / (int a, foo b) { return a / b.to_int(); } int operator / (foo a, int b) { return a.to_int() / b; }
-
Naja, wenn ich aber nicht jeden operator redefinieren muss, sondern das implizit umgewandelt wird, ist das natürlich schon was schöner, oder?
va kann ich für eine Funktion myFunction(int) dann auch myFunction(object) schreiben. Da bleibt mir sonst ja nichts anderes außer casten.@David_pb:
Welchen compiler / Version benutzt denn du, dass es klappt?
-
Visual C++ bei MS Visual Studio 2003.
-
hier gibt es doch bestimmt einige, die die gleiche minGW version haben wie ich? Könnte bitte mal einer testen, ob es bei ihm geht?
-
Dann besorg dir doch einfach nen neueren Compiler!?!
Ich wollte nur darauf hinweisen dass du auch die Operatoren überladen kannst. Ist IMHO auch oft sauberer, ich bin kein Fan von impliziten Konvertierungen.
-
Mit g++ 4.0.0 geht es zumindest.