2015-07-01 2 views
0

Я очищая std::stringstream обычным способом:Как очистить все липкие манипуляторы от (струнного) потока?

std::ostringstream ss; 
for(...; ...; ...) { 
    ... // Use ss. 
    if(some_condition_to_reset_stringstream) { 
     ss.str(std::string()); 
     ss.clear(); 
    } 
    ... // Use ss some more. 
} 

К сожалению, это не ясно липкие манипуляторов (std::hex, std::setfill и т.д.).

Есть ли способ сбросить все std::stringstream, включая любые IO-манипуляторы? Или мне нужно вручную сбросить каждый манипулятор по отдельности (надеюсь, не забывая об этом в процессе)?

+0

Просто выбросьте поток струн и создайте новый. –

+0

@MatteoItalia Строковый поток используется в цикле синтаксического анализа и должен быть сброшен на определенных итерациях, но не во всех. Поэтому, к сожалению, я не могу каждый раз создавать новую. – zennehoy

+1

@zennehoy: вы можете сохранить исходные флаги и просто сбросить их с помощью 'std :: ostringstream :: flags'. Обратите внимание, что вы также должны сохранять ':: fill',' :: width' и ':: precision', если хотите вернуть все изменения. – Zeta

ответ

3

Видимо в C++ 11 должна быть возможность поменять stringstreams:

if(some_condition_to_reset_stringstream) { 
    std::ostringstream().swap(ss); 
} 

К сожалению, у меня нет компилятора, который поддерживает это (г ++ 4.8.2), поэтому я не могу проверить, является ли это очищает липкие манипуляторы (я не понимаю, почему это не должно, хотя, когда-то реализовано).

По-прежнему ищу альтернативу, так как мой компилятор ее не поддерживает :)

Смежные вопросы