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 :
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;
}
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.

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())); }