Сначала вы должны сохранить некоторое состояние в каждом потоке. Вы можете сделать это с помощью функции iword
и указателя, который вы передаете ей, заданного xalloc
:
inline int geti() {
static int i = ios_base::xalloc();
return i;
}
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
на месте, вы уже можете получить некоторое состояние во всех потоках. Теперь вам просто нужно подключиться к соответствующей операции вывода. Цифровой вывод выполняется фасеткой, поскольку он потенциально зависит от локали. Итак, вы можете сделать
struct my_num_put : num_put {
iter_type
do_put(iter_type s, ios_base& f, char_type fill, long v) const {
return num_put::do_put(s, f, fill, v + f.iword(geti()));
}
iter_type
do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const {
return num_put::do_put(s, f, fill, v + f.iword(geti()));
}
};
Теперь вы можете протестировать материал.
int main() {
// outputs: 11121011
cout.imbue(locale(locale(),new my_num_put));
cout << add_one << 10 << 11
<< add_none << 10 << 11;
}
Если вы хотите, чтобы только следующее число увеличивалось, просто установите для этого слова значение 0
снова после каждого вызова do_put
.