function-pointer problem
-
Pack Funktionszeiger mit anderer Signatur in einen weiteren vector.
-
Pack Funktionszeiger mit anderer Signatur in einen weiteren vector.
ist das die einzige möglichkeit oder ginge es auch anders? Ich frage nur aus Interesse.
-
also wenn ich die typen mische?
Gar nicht. Du kannst nicht zwei verschiedene Typen in einem Container halten. Macht auch nicht viel Sinn. Hier könntest du den Effekt durch eine Hilfsklasse erzielen.
-
Nein, ein Funktionszeiger mit einem
floatist ein anderer Typ und kann nicht im Vektor abgelegt werden.
-
Sone schrieb:
Du kannst nicht zwei verschiedene Typen in einem Container halten. Macht auch nicht viel Sinn. Hier könntest du den Effekt durch eine Hilfsklasse erzielen.
Am Ende musst du ja irgendwie wissen, welchen Typ der aus dem Container entnommene Wert hat. Der Container wird's dir nicht sagen, da er nur eine Art von Typ aufnimmt, also sollte der Wert selbst von einer Klasse 'umschlossen' werden, die es dir sagt.
Ein Beispiel ist boost::any.
-
Youka schrieb:
Ein Beispiel ist boost::any.
Allerdings kann man die meisten Fälle, in denen man
boost::anyzu benötigen glaubt, sauberer lösen. Zum Beispiel durch dynamische Polymorphie.
-
Nexus schrieb:
Youka schrieb:
Ein Beispiel ist boost::any.
Allerdings kann man die meisten Fälle, in denen man
boost::anyzu benötigen glaubt, sauberer lösen. Zum Beispiel durch dynamische Polymorphie.Korrigiere mich bitte, aber läuft das im Endeffekt nicht alles auf Type-Erasure heraus?
-
Der Unterschied ist allerdings, dass man im Fall von boost::any den genauen dynamischen Typen wissen muss, um mit dem Objekt etwas anfangen zu können.
-
krümelkacker schrieb:
Der Unterschied ist allerdings, dass man im Fall von boost::any den genauen dynamischen Typen wissen muss, um mit dem Objekt etwas anfangen zu können.
Man muss wissen, welche dynamischen Typen es haben könnte.
-
Sone schrieb:
Nexus schrieb:
...Zum Beispiel durch dynamische Polymorphie.
Korrigiere mich bitte, aber läuft das im Endeffekt nicht alles auf Type-Erasure heraus?
So ist es. Der Wert wird auf dem Heap gelegt und somit der Typ versteckt. Die Zuweisung mit Templates erlaubt jeglichen Eingabetyp, problematisch ist lediglich die Ausgabe. Dazu muss bei Zuweisung auch der Typ gespeichert werden und abgefragt werden können, um den internen Zeiger wieder richtig zu casten.
-
Sone schrieb:
Man muss wissen, welche dynamischen Typen es haben könnte.
Und alle durchprobieren, oder wie?
Sone schrieb:
Korrigiere mich bitte, aber läuft das im Endeffekt nicht alles auf Type-Erasure heraus?
Nein. Dynamische Polymorphie alleine ist noch keine Type Erasure.
Mit Laufzeitpolymorphie kannst du eine virtuelle Funktion aufrufen, die intern den richtigen dynamischen Typ dispatcht. Bei
boost::anymuss die Fallunterscheidung explizit erfolgen, was dem Grundgedanken von Polymorphie gerade widerspricht. Deshalb istboost::anyauch nur für Spezialfälle brauchbar, genau wiedynamic_cast.