Ajouter des garanties à istream
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 :
Code:
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 ;
}
} |
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 ?
Note : Si en plus restore pouvait être nothrow, ce serait parfait