Bonjour,
Les opérations sur les stream (notamment opérateur >>) ne donnent qu'une garantie basique. Ce que je voudrai, c'est créer une fonction qui garantie que soit l'opération réussi, soit l'opération rate et aucun caractère est extrait et l'objet n'est pas modifié. En gros, faire quelque chose du genre :
Parmi les idées que j'ai eues, il y a sauvegarder le buffer associé et essayer de le restaurer, mais j'ai réalisé que j'ai aucune garantie de ne pas avoir des nouveaux caractères qui sont arrivés dans le stream entre temps (et je veux les conserver). Est-ce possible de faire ce que je veux (les performances ne sont pas importantes) ? Si oui, comment ?
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 template<typename T> std::istream& safe_extract(std::istream& in, T& o) { T copy = o; //Assume T copyable auto state = SAVE_STREAM_INFORMATION(in);//Je ne sais pas comment faire, et je ne sais même pas si c'est possible... try { if(in>>o) return in; o = copy; //On suppose que T::operator= est nothrow pour le moment RESTORE(in, state); //Je ne sais pas comment écrire la fonction RESTORE return in; } catch(...) { o = copy; //On suppose que T::operator= est nothrow pour le moment RESTORE(in, state); //Je ne sais pas comment écrire la fonction RESTORE throw ; } }
Note : Si en plus restore pouvait être nothrow, ce serait parfait
Partager