J'ai créé un RAII classe à l'aide de l'exemple de code à partir de cette réponse. Le gros avantage de cette technique vient, si vous avez plusieurs voies du retour d'une fonction qui définit des indicateurs sur une iostream. Selon la voie de retour est utilisé, le destructeur sera toujours appelé les drapeaux et l'obtiendrez toujours le réinitialiser. Il n'y a aucune chance d'oublier de restaurer les drapeaux lorsque la fonction retourne.
class IosFlagSaver {
public:
explicit IosFlagSaver(std::ostream& _ios):
ios(_ios),
f(_ios.flags()) {
}
~IosFlagSaver() {
ios.flags(f);
}
IosFlagSaver(const IosFlagSaver &rhs) = delete;
IosFlagSaver& operator= (const IosFlagSaver& rhs) = delete;
private:
std::ostream& ios;
std::ios::fmtflags f;
};
Vous pouvez alors l'utiliser par la création d'une instance locale de IosFlagSaver chaque fois que vous vouliez enregistrer le courant de l'état du pavillon. Lorsque cette instance est hors de portée, l'état du pavillon sera restauré.
void f(int i) {
IosFlagSaver iosfs(std::cout);
std::cout << i << " " << std::hex << i << " ";
if (i < 100) {
std::cout << std::endl;
return;
}
std::cout << std::oct << i << std::endl;
}