IlyaCk's blog

By IlyaCk, 11 years ago, In Russian

(Прошу прощения, тут больше я тупил, чем было реально трудностей... Вопрос можно считать закрытым)

Пусть в некотором категорически не олимпиадном, но и не шибко практическом проекте появилось желание сделать такую штуку: создать некий класс Two_ostreams, чтоб потом можно было создать его экземпляр как-то в стиле Two_ostreams log_and_view("log.txt", cerr);, и чтоб каждый вызов log_and_view << a+b, посчитав сумму a+b, писал её сразу и на cerr, и в файл log.txt.

Казалось бы, элементарно:

class Two_ostreams
{
protected:
	ostream &ostr1, &ostr2;
public:
	Two_ostreams(ostream &o1, ostream &o2) : ostr1(o1), ostr2(o2) { } ;
	template<class D> Two_ostreams &operator << (const D &data) 
	{
		ostr1 << data;
		ostr2 << data;
		return *this;
	}
};

Да не тут-то было: оно работает с примитивными типами, для коих перегрузка << стандартна, но всё ломается при попытке использовать вышеизложенный Two_ostreams с классом C, в котором и определяется собственный friend ostream &operator << (ostream&, const C&), и свежеопределённый << используется в одном из методов. Конкретнее, в момент компиляции Two_ostreams ещё нету перегрузки << для C. Полностью переставлять местами, чтобы всё определение C шло раньше всего определения Two_ostreams никуда не годится, т.к. хочется именно использовать Two_ostreams в некоторых методах C.

Это всё вообще имеет красивое решение? или любой способ будет настолько мрачен, что лучше уж везде по два раза повторять flog << blablabla; cerr << blablabla;?

  • Vote: I like it
  • +11
  • Vote: I do not like it