specialisation de template
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:
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:
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:
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:
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 ?