Bonjour
J'ai commencé une classe de serialization de données dans un document xml. Pour cela, j'ai créé une interface ISerializable et une classe Archive :
et j'ai spécialisé les types simples :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class ISerializable { public: ISerializable() {} virtual ~ISerializable() {} virtual void Serialize(Archive& arch) const = 0; virtual void DeSerialize(Archive& arch) = 0; }; class Archive { wxXmlNode* m_root; public: Archive(wxXmlNode* root); virtual ~Archive(); template <typename T> bool Write(const wxString& name, const T& value); template <typename T> bool Read(const wxString& name, T& value); };
Mais j'aurai aussi souhaité pouvoir archiver des classes ISerializable. Par contre, je ne peux spécialiser une classe abstraite (enfin, ça ne sert à rien). Une solution (qui est celle que j'ai implémenté pour le moment), et de créer une autre methode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 template <> bool Archive::Write<int>(const wxString& name, const int& value); template <> bool Archive::Read<int>(const wxString& name, int& value); template <> bool Archive::Write<double>(const wxString& name, const double& value); template <> bool Archive::Read<double>(const wxString& name, double& value); ...
mais cela casse l'API. J'aurai préféré garder uniquement Read et Write. En effet, je souhaiterai aussi pouvoir archiver des conteneur de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class Archive { ... bool WriteObject(const wxString& name, const ISerializable& value); bool ReadObject(const wxString& name, ISerializable& value); };
Puis je faire ceci ? Quelles pistes me conseillez vous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // PSEUDO CODE ... template <typename CONTAINER, typename VALUE> bool Archive::Write(const wxString& name, const CONTAINER& value) { for (CONTAINER::const_iterator it = value.begin(); it != value.end(); ++it) { Write(name, *it); // *it est de type VALUE } }
Partager