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 :


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);
};
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
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 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
class Archive
{
	...
 
	bool WriteObject(const wxString& name, const ISerializable& value);
 
	bool ReadObject(const wxString& name, ISerializable& 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
// 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
   }
}
Puis je faire ceci ? Quelles pistes me conseillez vous ?