2010-12-11 4 views
1

У меня было несколько вопросов по поводу потоков и прочее, но, немного подумав, я пришел к выводу, что все, что мне нужно, это пользовательский тип флеша. Я хочу, чтобы мой поток очистился, когда он получил новую строку. Это экономит на том, чтобы напечатать std :: endl. Можно ли это реализовать? Я использую ostream с пользовательским stringbuf.Пользовательский поток потокового типа

+0

Простите меня, но зачем печатать 'endl' несколько раз труднее, чем писать новый поток из (почти) царапин? –

+0

Это не так много, насколько это невозможно, и если да, то как. – Jookia

ответ

1

Я считаю, что все это заняло бы это переопределение ostream::put(char), но не цитируйте меня на этом:

template <typename Ch> 
class autoflush_ostream : public basic_ostream<Ch> { 
public: 
    typedef basic_ostream<Ch> Base; 
    autoflush_ostream& put(Ch c); 
}; 

template <typename Ch> 
autoflush_ostream<Ch>& autoflush_ostream<Ch>::put(Ch c) { 
    Base::put(c); 
    if (c == "\n") { 
     flush(); 
    } 
    return *this; 
} 

Вы, возможно, придется переопределить каждый метод и функцию, которая принимает символ или последовательность символов, который определен в STL. Все они в основном будут делать одно и то же: вызовите метод/функцию, определенные в суперклассе, проверьте, была ли только что напечатана новая строка и если она была сброшена.

+0

basic_ostream :: put не является виртуальным, поэтому версия производного класса не будет использоваться, если статический тип объекта не будет autoflush_ostream (т. Е. Объект, ссылка или указатель autoflush_ostream). В частности, это означает, что 'stream << '\ n'' не может называть ваш put. –

+0

Научите меня выбирать программирование во сне. – outis

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