boost::serialization et std::unique_ptr
Je cherchais un moyen de sauvegarder/charger des donn�es de mon projet, et je suis tomb� sur boost::serialization qui avait l'air pas mal sur le papier.
Sur le papier, parce qu'il semble qu'il ne supporte pas les std::unique_ptr, et j'ai moyennement envie de faire passer tout mon projet aux pointeurs nus (quoique parfois j'h�site, vues les gal�res que les unique_ptr m'infligent...le souci c'est que je pr�f�re diminuer le risque de fuites m�moires, surtout si quelqu'un d�cide de contribuer...)...
Vu que je n'ai jamais utilis� boost::serialization avant et que je doute franchement d'avoir tout compris par rapport � son usage, je me demande si ce n'est pas plut�t moi qui ai merd� quelque part. (A moins que le probl�me ne vienne d'une mauvaise utilisation de std::unique_ptr... �a ne m'�tonnerait pas outre mesure non plus.)
Le probl�me viens du fait que le constructeur par copie est appel� par boost::interface_iarchive::operator>>(...) . J'aurai pu simplement lui passer un pointeur brut issu de mon unique_ptr, sauf que celui-ci est en fait poss�d� par un vector et qu'une telle op�ration impliquerais d'it�rer sur le vecteur, hors, j'ai cru comprendre que boost �tait capable de le faire lui-m�me.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
void LoadTextFile::installEventManager(RenderWindow & target) throw()
{
...
...
...
std::string filename(openFile.GetPath());
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia >> static_cast<Group&>(target);// génère l'erreur, bien qu'elle ne soit pas vraiment causée par cette ligne
//target contiens un std::vector<std::unique_ptr<Object>> qui doit être sérializé et qui cause le problème
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
...
#include <boost/serialization/vector.hpp>
...
class Group : public Object
{
...
...
...
private:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & m_children;
}
public:
protected:
std::vector<std::unique_ptr<Object>> m_children;
} |
Si quelqu'un � une id�e de comment r�soudre ce probl�me, je suis preneur... Ou m�me si quelqu'un me dis que boost en est incapable. Si c'est le cas, je ferais une solution "maison" m�me si je pr�f�re �viter de r�inventer la roue :/