次のようなことができるように、C++ での I/O ストリームの書式設定の効果を範囲制限したいと思います。
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
ベース、精度、塗りつぶしなどは、ブロックを離れるときに以前の値に復元されます。
これが私が思いついた最高のものです:
#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 (...) {} }
};
...しかし、C++ iostream はかなり厄介な領域であり、上記の安全性/適切性については確信が持てません。それは危険ですか?あなた(またはサードパーティ)はすでにより良い結果を出していますか?