Bonjour,
J'ai besoin d'une entité qui fasse référence à un objet dont la durée de vie excède celle de l'entité en question.
Autrement dit, mon entité doit faire référence à un objet déjà existant, et n'avoir aucune responsabilité quant à sa destruction (l'objet peut être statique).
Je crois qu'on peut dire que la seule responsabilité de l'entité est d'encapsuler la ressource référencée, et de masquer le mécanisme de référencement.
Mais il se peut qu'à un moment du programme, l'entité n'aie pas d'objet à référencer.
En C++98, j'utilisais des pointeurs nus.
D'après ce que j'ai compris, il vaut mieux éviter d'utiliser les pointeurs nus.
(À moins que ce cas précis soit l'un des rares ou l'utilisation des pointeurs nus n'est pas déconseillée...)
Avec l'arrivée du C++11, je me tourne naturellement vers std::reference_wrapper.
Ça référence un objet existant, ça ne s'occupe pas de sa destruction, et on peut même changer d'objet référencé en cours de route.
Sauf que la référence doit toujours être valide.
Bon... peut-être du côté de std::weak_pointer ?
D'après ce que j'ai compris, c'est comme std::reference_wrapper, excepté pour le point qui me gênait (et ça s'utilise comme un pointeur et non pas comme une référence) : ils peuvent être expired, si je ne me trompe pas.
Sauf qu'un ne peut construire un std::weak_pointer qu'à partir d'un autre std::weak_pointer ou d'un std::shared_pointer, et les std::shared_pointer ont la responsabilité de détruire les objets qu'ils référencent.
Est-ce que par hasard quelqu'un connaîtrait une classe qui serait une sorte de mix entre std::reference_wrapper et std::weak_pointer (dans la bibliothèque standard, j'entends), ou je dois la faire moi-même ?
Je me doute bien que ce ne doit pas être très compliqué, mais ce serait idiot de réinventer la roue...
Partager