Warum würde ich dynamic_cast verwenden, um TO void * zu casten?

8

Also habe ich die Antworten zu dynamic_cast von "void *" gelesen und Sie können das tun Wird von void * auf T * umgestellt, weisen einige der Antworten darauf hin, dass es möglich ist, T * auf void * zu setzen, aber geben Sie keine Angabe warum an du würdest das tun wollen.

Ist das nur eine Kleinigkeit, dass es möglich ist, oder gibt es einen Fall, wo es Sinn machen würde? Ich dachte über vielleicht für Lesbarkeit nach oder um klar zu machen, dass wir zu einem void * konvertieren, aber angesichts des Zwecks von dynamic_cast passt es nicht sehr gut zu mir.

Gibt es irgendeinen Grund, etwas anderes zu tun, als T * implizit zu void * werden zu lassen? Ich habe zu diesem Zweck von Zeit zu Zeit C-Style-Umwandlungen in void * gesehen, ich nehme an, dass sie nur explizit sind (vorausgesetzt, wir machen nichts Ungewöhnliches, wie zum Beispiel int auf einen Zeiger oder etwas zu werfen).

    
FatalError 28.02.2012, 01:52
quelle

2 Antworten

7

Erstens, wenn dynamic_cast<void*>(x) verwendet wird, erhalten Sie einen Zeiger auf das erste Byte des am meisten abgeleiteten Objekts. Solange der statische Typ von x polymorph ist.

Dies kann in einer Handvoll von Szenarien nützlich sein, in denen die Adresse als Objektidentität dient:

  • Sie haben jetzt eine Möglichkeit, Zeiger auf Unterobjekte desselben Objekts vollständig von Zeigern zu nicht verwandten Unterobjekten zu unterscheiden.
  • Sie können nun einige verdrehte Graphen durchlaufen, ohne das gleiche Objekt mehrmals zu besuchen ..., die für die Serialisierung verwendet werden können.

Zugegeben, dies ist sicherlich keine tägliche Verwendung , aber in C ++ ist die Speicheradresse ein De-facto-Bezeichner für Objekte, so dass ein Mechanismus für den Zugriff von jedem Teil der Vererbungshierarchie aus sicher ist nützlich für diese wenigen Randfälle.

    
Matthieu M. 28.02.2012, 07:43
quelle
5

Es gibt einen Zweck, irgendwie. Es ist in dem Teil der Spezifikation angedeutet, der es erlaubt. Ab N3337, Abschnitt 5.2.7, Absatz 7:

  

Wenn T "Zeiger auf cv void" ist, dann ist das Ergebnis ein Zeiger auf das am weitesten abgeleitete Objekt, auf das v zeigt.

Also ein dynamic_cast<void*>(...) ist wirklich eine Abkürzung für static_cast<void*>(dynamic_cast<MostDerivedType*>(...)) . Und das wäre nützlich ... irgendwie.

Die Schwierigkeit, es nützlich zu machen, besteht darin, dass Sie nicht unbedingt wissen, was MostDerivedType ist. Schließlich kann es für jeden Ausdruck anders sein. Wenn du es also als void* hast, hast du nicht unbedingt die Möglichkeit, es sicher zurückzuwerfen . Wenn Sie eine Vermutung über MostDerivedType und nur static_cast machen und Sie falsch sind, dann befinden Sie sich in undefiniertem Verhaltensland. Wenn Sie den dynamic_cast auf diesen Typ anwenden (dann static_cast auf void* ), wird mindestens NULL zurückgegeben, wenn er nicht von diesem Typ ist.

Also nein, ich würde sagen, dass es nicht sehr nützlich ist. Nicht wenn Sie innerhalb der Grenzen von C ++ leben und sich nicht auf potenziell undefiniertes Verhalten verlassen wollen.

    
Nicol Bolas 28.02.2012 02:05
quelle

Tags und Links