Если я применяю произвольное количество манипуляторов к потоку, есть ли способ отменить применение этих манипуляторов общим способом?
Например, рассмотрим следующее:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "Hello" << hex << 42 << "\n";
// now i want to "roll-back" cout to whatever state it was in
// before the code above, *without* having to know
// what modifiers I added to it
// ... MAGIC HAPPENS! ...
cout << "This should not be in hex: " << 42 << "\n";
}
Предположим, я хочу добавить код в MAGIC HAPPENS
, который вернет состояние манипуляторов потока до того, что было до того, как я сделал cout << hex
. Но я не знаю, какие манипуляторы я добавил. Как я могу это сделать?
Другими словами, я хотел бы написать что-то вроде этого (psudocode/fantasy code):
std::something old_state = cout.current_manip_state();
cout << hex;
cout.restore_manip_state(old_state);
Возможно ли это?
EDIT:
Если вам интересно, я заинтересован в том, чтобы сделать это в пользовательском operator<<()
, который я пишу для сложного типа. Тип представляет собой своего рода дискриминационный союз, а разные типы значений будут иметь разные манипуляции, применяемые к потоку.
EDIT2:
Ограничение: я не могу использовать Boost или любые другие сторонние библиотеки. Решение должно быть в стандартном С++.