Il m'a fallu du temps pour le comprendre, mais la sémantique de boost::any
est confuse.boost :: toute confusion avec les pointeurs et les valeurs
Avec les types de valeur, vous l'utilisez comme ceci:
int value = 100;
boost::any something;
something = value;
//...later...
int value = boost::any_cast<int>(&something);
Ce code est clair et logique, mais les magasins value
en interne comme une copie. Cela signifie que pour les objets plus grands que je place à l'intérieur boost::any
, ils seront copiés. Aussi toutes les fonctions que je remplace void*
avec ceci s'attendent à ce que la valeur en dehors de la fonction soit modifiée lorsque je modifie la valeur contenue dans l'objet boost::any
(ce qui n'arrivera pas, puisqu'il l'a copié).
Donc, si je mets des pointeurs en elle, les choses deviennent étranges:
int value = 100;
boost::any something;
something = &value;
//...later...
int* value = *boost::any_cast<int*>(&something);
Je dois déréférencer la valeur de retour dans ce cas parce que boost::any_cast
retours int**
! Je n'ai pas non plus vérifié mais je pense que cela peut planter si something.empty() == true
. Ce n'est pas simple du tout.
Je ne veux pas stocker de valeurs dans mon boost::any
, je veux qu'il ne fonctionne que sur les pointeurs et se comporte sémantiquement plus proche de void*
. Pointeurs dans, pointeurs, avec un certain type de sécurité mélangé po Essentiellement ce que je veux est boost::any_pointer
, ou quelque chose comme ça. Existe-t-il un moyen d'interdire boost::any
d'accepter autre chose que des pointeurs? Et sinon, y a-t-il une alternative à boost::any
qui peut me donner la sémantique que je recherche?
'boost :: any' est joli e Asy pour créer et ensuite vous pouvez modifier la sémantique comment vous voyez en forme. –
Votre premier extrait ne fonctionne pas et nécessite dereferencement (comme snippet2) [Demo] (http://coliru.stacked-crooked.com/a/df5bdb307f56b709) – Jarod42
Vous pouvez toujours envelopper 'boost :: any' dans une classe à autoriser uniquement le pointeur. – Jarod42