Welcher Type? [Fuer FAQ]
-
Mmmm, weil ich den Type herausfinden will, und nicht etwas casten.
Okey, zugegeben, ich kenne den dynamic_cast nicht gut.
Aber so wie ich das verstanden habe, hat es was mit Classen und Template
zutun. Und nicht direckt mit obj = int.
-
Green_Ghost schrieb:
#include <typeinfo> #include <iostream> template<typename T> ich_bin(const T &a){ std::cout<<std::typeid(a).name()<<std::endl; } //Verwendung int bla; ich_bin(bla); //Ausgabe: int
verlass dich nicht drauf, dass int wirklich ausgegeben wird, das garantiert der standard nämlich nicht!
Wenn Typetraits zur Compilezeit ausgewertet werden, sind sie denkbar ungeeignet, um den Laufzeittyp eines Objektes herauszufinden
in den hier gegebenen beispielen wird aber keine dynamische typisierung benutzt, deshalb ist das hier alles etwas komisch.
-
Naja die Frage ist doch, wozu will man den Typ eines Objektes wissen? Um es in diesen Typ zu casten und eine speziellere Methode aufzurufen zum Beispiel. Was anderes fällt mir im Moment aber nicht wirklich ein.
-
@otze:
Stimmt. Ich wuerde sowas auch nie machen. Sieht ja auch ned schoen aus.
Ich hab das auch nur zu demostrations zwecken gemacht.
Aber gut das du das noch schreibst, sonst macht es vieleicht doch noch ein
anfaneger falsch.@Bashar:
Ich hab das Manual geschrieben, weil in letzter Zeit einige so was fragten.
Ich glaube es is ne Aufgabe einer Uni/Kurs/Buch... weiss nicht.
So schreib ich mal diese variante nieder, die man natuerlich
noch ausbauen muss. Ist mir klar, soll aber auch keine Loesung sein.Ghost
[EDIT]
Wenn es Scheisse ist, koennt ihr das schon sagen.
War ja nur ne Idee.
[EDIT]
-
Bashar schrieb:
Wenn Typetraits zur Compilezeit ausgewertet werden, sind sie denkbar ungeeignet, um den Laufzeittyp eines Objektes herauszufinden
ja schon klar, aber warum muss ich überhaupt den typ zur laufzeit bestimmen
wenn ich mittels traits ein statisches konstrukt zu einem speziellen typ
schon kompilieren kann.
-
Weil der Typ zur Laufzeit unterschiedlich sein kann:
Base* obj; if (blub) obj = new Derived1; else obj = new Derived2;
-
und wenn ich eine Template klasse habe, die bei int etwas anders macht
als bei char. So kann ich herausfindes was es fuer ein type ist.
-
Green_Ghost schrieb:
und wenn ich eine Template klasse habe, die bei int etwas anders macht
als bei char. So kann ich herausfindes was es fuer ein type ist.Das ist kein gutes Beispiel. In so einem Fall solltest du eher Überladung bzw. Spezialisierung verwenden. Hier sind alle nötigen Informationen schließlich zur Compilezeit bekannt. Kein Grund für die RTTI-Kanone.
-
Bashar schrieb:
Weil der Typ zur Laufzeit unterschiedlich sein kann:
Base* obj; if (blub) obj = new Derived1; else obj = new Derived2;
auch klar, ich suche nur einen "guten" grund überhaupt rtti
überhaupt einzusetzen. hat jetzt nichts direkt mit green_ghosts beitrag zu
tun, sondern nur mit dem warum.
-
auch klar, ich suche nur einen "guten" grund überhaupt rtti
überhaupt einzusetzen.Spontan fällt mir da z.B. double-dispatch ein. Z.B. wie in der Implementation eines azyklischen Visitors.
-
HumeSikkins schrieb:
auch klar, ich suche nur einen "guten" grund überhaupt rtti
überhaupt einzusetzen.Spontan fällt mir da z.B. double-dispatch ein. Z.B. wie in der Implementation eines azyklischen Visitors.
Und jetzt nochmal auf Deutsch.
-
audacia schrieb:
HumeSikkins schrieb:
auch klar, ich suche nur einen "guten" grund überhaupt rtti
überhaupt einzusetzen.Spontan fällt mir da z.B. double-dispatch ein. Z.B. wie in der Implementation eines azyklischen Visitors.
Und jetzt nochmal auf Deutsch.
ROFLMAO
:p
-
Ein azyklischer Visitor ist ein Designpattern -> www.google.de
DoubleDispatching ist eine Multithreading Technik, um die sicherheit eines Threads zu gewährleisten.
-
audacia schrieb:
HumeSikkins schrieb:
auch klar, ich suche nur einen "guten" grund überhaupt rtti
überhaupt einzusetzen.Spontan fällt mir da z.B. double-dispatch ein. Z.B. wie in der Implementation eines azyklischen Visitors.
Und jetzt nochmal auf Deutsch.
kennst du den unterschied zwichen profi und amateur?
btw: das 'spontan' ist wichtig
-
Glamdrink schrieb:
DoubleDispatching ist eine Multithreading Technik, um die sicherheit eines Threads zu gewährleisten.
LOL? So ein Schwachsinn.
-
-
Glamdrink schrieb:
DoubleDispatching ist eine Multithreading Technik, um die sicherheit eines Threads zu gewährleisten.
AFAIR ist das was ganz anderes...
das double dispatching kann man ein bischen wie templates zur laufzeit sehen.(jaja, ich wusste net, wie ichs anders umschreiben sollte^^) nehmen wir mal an, wir haben folgende konstellation:
class Base{...}; class A:public Base{...}; class B:public Base{...}; void test(Base* a,Base* b); int main(){ Base* a=new A; Base* b=new B; test(a,b); delete a; delete b; } }
ein einfacher fall. double dispatching löst das problem, wenn die Funktion test,je nachdem welche typen sich hinter a und b verstecken, sich anders verhalten soll(also doch en bissl wie templates^^)
ein einfaches beispiel wäre zb ein test ob zwei verschiedene formen sich überlappen, bei 2 kreisen muss das anders funktionieren als bei 2 quadraten, und bei einem kreis und einem quadrat ist das auch wieder anders.
/wie gesagt, alles AFAIR^^)
-
Vielleicht ist noch anzumerken, dass in "Mehr Effektiv C++" eine Richtline über double dispatch von S. Meyers geschrieben wurde. (5.7, Richtlinie 31) Dort steht auch, wie man nun test(..) implementieren kann.