Es dauerte eine Weile, um herauszufinden, aber die Semantik von boost::any
sind verwirrend.Boost :: Irgendeine Verwechslung mit Zeigern gegen Werte
Mit Werttypen verwenden Sie es wie so:
int value = 100;
boost::any something;
something = value;
//...later...
int value = boost::any_cast<int>(&something);
Dieser Code ist klar und macht Sinn, sondern speichert value
intern als Kopie. Das bedeutet für größere Objekte, die ich innerhalb boost::any
platziere, werden sie kopiert. Auch alle Funktionen, die ich ersetze void*
damit erwarten, dass der Wert außerhalb der Funktion geändert wird, wenn ich den Wert im boost::any
Objekt ändern (was nicht passieren wird, da es kopiert).
Wenn ich also Zeiger in sie setzen, werden die Dinge seltsam:
int value = 100;
boost::any something;
something = &value;
//...later...
int* value = *boost::any_cast<int*>(&something);
ich zu dereferenzieren den Rückgabewert in diesem Fall, weil boost::any_cast
Renditen int**
! Ich habe auch nicht überprüft, aber ich denke, dass dies abstürzen kann, wenn something.empty() == true
. Das ist einfach nicht einfach.
Ich möchte keine Werte in meinem boost::any
speichern, ich möchte, dass es nur auf Zeigern funktioniert und sich semantisch näher an void*
verhält. Zeiger hinein, Zeiger raus, mit etwas Typsicherheit gemischt. Im Wesentlichen will ich boost::any_pointer
, oder so ähnlich. Gibt es eine Möglichkeit zu verbieten boost::any
alles außer Zeigern zu akzeptieren? Und wenn nicht, gibt es eine Alternative zu boost::any
, die mir die gesuchte Semantik geben kann?
'boost :: any' ist hübsch e asy zu erstellen und dann können Sie die Semantik ändern, wie Sie es für richtig halten. –
Ihr erstes Snippet funktioniert nicht und erfordert eine Dereferenzierung (als snippet2) [Demo] (http://coliru.stacked-crooked.com/a/df5bdb307f56b709) – Jarod42
Sie können noch "boost :: any" in eine Klasse umwandeln Erlaube nur Zeiger. – Jarod42