LINUX.ORG.RU

[c++]заглушка к cout

 


0

1

Привет, лор!

Мне хочется сделать заглушку к cout, которая дописывает '\n' после каждого её вызова. Насколько я понимаю, у меня должен быть объект, у которого перегружен operator<<, и который возвращает сам себя на operator<<.
Но я не понимаю, как отследить окончание цепочки вызова операторов. То есть, грубо говоря, в строке
mycout << a << b отличить operator<<(mycout, a) от operator<<(mycout, b), и понять, что b - последний в списке.

★★★

Ответ на: зачем от visual_pipe

Как говорится, ООП головного мозга :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от NaViKotE

ТС не это хочет. Алсо std::endl делает новую строку и flush, что в большинстве случаев не нужно. ТС хочет чтобы

my_stream << "Lalala " << "lololo";
my_stream << "linux.org.ru"
Выводило
Lalala lololo
linux.org.ru

Здравая мысль и удобная. Кстати, тогда бы и пробел после каждого слова добавлял бы, как делает qDebug() и прочие Qt-шные потоки с помощью QTextStream.

Как сделать, не подскажу, оч долго не спал.

Obey-Kun ★★★★★
()
Ответ на: комментарий от Obey-Kun

Допёр, в Qt это очень просто реализовано. Выглядит применение вот так:

qDebug() << "ololo" << "alala";
qDebug() << "linux.org.ru";

qDebug() создаёт поток и возвращает его. Когда он уничтожается (по достижении «;»), в деструкторе туда дописывается «\n». Вот и всё, делов-то. Чтобы поток не создавать и не удалять, всегда возвращай cout.

Obey-Kun ★★★★★
()

> Но я не понимаю, как отследить окончание цепочки вызова операторов.

В деструкторе выводи конец строки.

const86 ★★★★★
()
Ответ на: комментарий от Obey-Kun

Obey-Kun, браво :)

Огромное спасибо за совет!

vzzo ★★★
() автор топика
Ответ на: комментарий от Obey-Kun

> Чтобы поток не создавать и не удалять, всегда возвращай cout.

Мнэ... но в этом случае деструктор не будет вызываться (cout доживет до конца работы программы). И вообще (проверять лень, но наск я помню), если qDebug() ф-я, то возвращенный ей объект (созданный на стеке ф-ии) должен бы сдохнуть сразу по выходу из ф-ии, а есди qDebug это объект с перегруженными операторами <<, то во первых это немного геморно делать (ну можно через шаблоны), а во вторых есть же ограничение на передачу временных объектов по не-константной ссылке?

Ъ путь (самый простой) это

[code=C]

ostream& myendl( ostream& S ){ return S<<«\n»;}

cout<<...<<myendl; [/code]

Это наск мне помнится называется модификатором потока и работает через уже перегруженный оператор << для ostream.

AIv ★★★★★
()
Ответ на: комментарий от AIv

> Мнэ... но в этом случае деструктор не будет вызываться (cout доживет до конца работы программы).

Я к тому, что можно сделать класс-обёртку над cout, как и хотел ТС. И в том классе никаких потоков не создавать.

Obey-Kun ★★★★★
()
Ответ на: комментарий от Obey-Kun

Ну в принципе работает, и даже не громоздко

#include <iostream>
using namespace std;

struct mycout {
	template <class T> mycout& operator <<( const T& x ){ cout<<x; return *this; } 
	~mycout(){ cout<<"\n"; }
};

int main() {
	mycout()<<123<<" "<<"456";
	mycout()<<"qwerty";
	return 0;
}

Но варианты

mycout()<<...;
cout<<...<<"\n";       
отличаются всего лишь на ДВА символа, и при этом второй вариант все таки погибче и понаглядней будет...

AIv ★★★★★
()
Ответ на: комментарий от AIv

А мне поведение как у qDebug() всё же по нраву. Ну ведь правда удобно:

int a = 5;
qDebug() << "test" << a
         << "tttest";
qDebug() << a << a << a;
test 5 tttest
5 5 5

И шансов на ошибку меньше.

Хотя тут речь только о переносе строки, но ведь ей б-гу, в 99% случаев он нужен.

Obey-Kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.