Bonjour,
Je voudrais spécialiser une classe template pour un type particulier, tout en pouvant continuer à pouvoir spécifier le type du template.
Je sais que ce n'est pas très clair, voilà ce que je cherche concrètement à faire :
J'ai un classe abstraite XmlInterface qui représente des objets pouvant être stockés au format XML.
Plusieurs classes hérites de XmlInterface, dont la classe ObservableList.
La classe ObservableList hérite aussi de QList (le conteneur de Qt équivalent à std::list).
Le but est de pouvoir stocker une liste d'objet au format XML.
Pour ce faire j'ai spécialiser QList en QList<XmlInterface*> lors de la création de la classe ObservableList.
Le problème est que lorsque j'instancie un objet de type ObservableList je ne peux pas spécifier le type des objets que je veux y stocker.
J'aimerais donc savoir s'il est possible de restreindre le type des objets stockés au type XmlInterface et ses sous types tout en gardant "l'aspect" template ?
Voici une simplification de mon code actuel :
Pour parvenir au résultat en commentaire je ne dois pas spécialiser QList mais dans ce cas comment m'assurer que le type template utilisé ne correspond pas à autre chose qu'une classe dérivée de XmlInterface ?
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 class XmlInterface { public : virtual QDomDocument toXml() const = 0; virtual bool fromXml(const QString& filePath) = 0; }; class ObservableList : public QList<XmlInterface*>, public XmlInterface { public : QDomDocument toXml() const { QDomDocument domDoc; foreach (const XmlInterface* element, *this) { domDoc.appendChild(element->toXml()); } return domDoc; } }; class Product : public XmlInterface { public : QDomDocument toXml() const; }; class Taskmaster : public XmlInterface { public : QDomDocument toXml() const; }; int main(int argc, char *argv[]) { ObservableList products; // Je voudrais ObservableList<Product*> products // Pour que products.at(0) retourne un Product* et non un XmlInterface* }
Merci d'avance, bonne journée.
Partager