Bonjour,
Je vous présente tout de suite un exemple de ce qui m'interpelle, je vous explique ensuite ce que j'ai du mal à comprendre :
Avant tout autre chose, la classe StringReader est là pour l'exemple. Utiliser le type std::string me permet de ne pas avoir à ajouter la définition d'une nouvelle structure.
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
41
42
43
44
45
46
47
48
49 #include <iostream> #include <istream> #include <fstream> using namespace std; template <typename T> class ObjectReader { public : ObjectReader() {}; virtual ~ObjectReader() {}; virtual void readFrom(const istream& is) = 0; }; template <typename T> class ObjectFileReader : public ObjectReader<T> { public : ObjectFileReader() : ObjectReader<T>() {}; using ObjectReader<T>::readFrom; // Requis void readFrom(const string& filePath) { ifstream ifs(filePath.c_str()); readFrom(ifs); ifs.close(); } }; class StringReader : public ObjectFileReader<string> { public : StringReader() : ObjectFileReader() {}; using ObjectFileReader::readFrom; // Requis void readFrom(const istream& is) { cout << "StringReader::readFrom(const istream&)" << endl; } }; int main() { StringReader temp; temp.readFrom("main.cpp"); return 0; }
Si j'ai bien compris, les deux lignes requises (cf. commentaires de l'exemple), le sont pour s'assurer que l'on utilise pas une surcharge template de la classe parente qui ne définit pas les méthodes.
Donc première question : Est-ce bien la bonne raison ? ^^
Et oui, une heure tardive et pas trop l'habitude de la spécification des classes templates...
Si oui, existe-t-il un moyen plus pratique de parvenir au même résultat.
Effectivement, je n'ai qu'une méthode à chaque fois à ré-utiliser mais dans le cas où il y en aurais plus, ça deviens vite lourd à mettre en place non ?
Je suis aussi preneur pour tout commentaires, bien que sur un exemple minimaliste comme celui-là il ne doit pas y avoir grand chose à dire.
Merci d'avance.
[EDIT] Petite question supplémentaire :
Je crois avoir lu quelque part que la STL met en place le patron de conception RAII, est-ce vrai pour les flux ?
Si oui, je peux bien faire ce qui suit sans risque ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part void ObjectFileReader<T>::readFrom(const string& filePath) { readFrom(ifstream(filePath.c_str())); }
Partager