2009-08-18 7 views
4

Je voudrais champ limite l'effet de la mise en forme de flux E/S en C++, pour que je puisse faire quelque chose comme ceci:Comment implémenter le formatage iostream étendu?

std::cout << std::hex << ... 
if (some_condition) { 
    scoped_iofmt localized(std::cout); 

    std::cout << std::oct << ... 
} 
// outside the block, we're now back to hex 

de telle sorte que la base, la précision de remplissage, etc. sont restaurés leurs valeurs précédentes à la sortie du bloc.

Voici le meilleur que je suis venu avec:

#include <ios> 

class scoped_iofmt 
{ 
    std::ios& io_;  // The true stream we shadow 
    std::ios dummy_; // Dummy stream to hold format information 

    public: 
    explicit scoped_iofmt(std::ios& io) 
       : io_(io), dummy_(0) { dummy_.copyfmt(io_); } 
    ~scoped_iofmt() { try { io_.copyfmt(dummy_); } catch (...) {} } 
}; 

... mais C++ iostreams sont un domaine épineux, et je ne suis pas sûr de la sécurité/pertinence de ce qui précède. Est-ce dangereux? Avez-vous (ou avez un tiers) déjà fait mieux?

Répondre

Questions connexes