Нужно вывести одно и то же на экран и в файл, например:
fout << "x = " << x;
cout << "x = " << x;
Как реализовать перегрузку операции <<, чтобы каждый раз приходилось писать команду вывода только один раз?
Вы хотите внести в оператор вывода вывод "x = "
или вывод одновременно и в файл, и на экран? И то и другое - насколько это разумно?
В первом случае, что бы вы ни выводили, все пойдет с надписью "x ="
...
Во втором - что бы вы ни выводили в любой файл - пойдет еще и на экран...
Оно вам точно надо?..
class PairStream
{
public:
PairStream(ostream& f):file(f){}
template<typename T>
PairStream& operator<<(const T& t)
{
cout << t;
file << t;
return *this;
}
ostream& file;
};
int main(int argc, const char * argv[])
{
ofstream f("log");
PairStream p(f);
int x = 100;
p << "x = " << x << "\n";
}
Если нет предубеждения на использование boost, можно воспользоваться этим примером http://stackoverflow.com/questions/999120/c-hello-world-boost-tee-example-program
или
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/compose.hpp>
#include <fstream>
#include <iostream>
#include <iomanip>
template<typename T1, typename T2>
boost::iostreams::stream< boost::iostreams::tee_device<T1,T2> >
make_tee_ostreams(T1& arg1, T2& arg2)
{
typedef boost::iostreams::tee_device<T1,T2> device;
typedef boost::iostreams::stream< device > stream;
return stream( device(arg1, arg2) );
}
int main(int argc, char *argv[])
{
std::ofstream file1("file1.txt");
std::ofstream file2("file2.txt");
auto file12 = make_tee_ostreams( file1, file2 );
file12 << "Hello World!" << std::endl;
return 0;
}
Решение на основании комментария ТС:
Хотелось бы определить другой класс PairStream и перегрузить операцию вывода для этого класса, чтобы вместо двух строк написать: PairStream s(fout); s << "x = " << x;
class PairStream {
public:
PairStream(std::ostream& one, std::ostream& two) : one(one), two(two) {}
private:
std::ostream& one;
std::ostream& two;
};
PairStream& operator<< (PairStream& str, const UserType& ut)
{
str.one << ut; // Предпологается, что для UserType реализован вывод в поток
str.two << ut;
return str;
}
void function_out (int x)
{
m_fout << "x = " << x;
m_cout << "x = " << x;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Составить функцию, позволяющую определить позицию первого вхождения в заданный строку некоторого символа с другой заданной строкиРезультатом...
Проект развернуть на сервере уже какое-то время и пришла пора задуматься о бекапирвоании
Сделал диаграмму БД в MySQL Workbench, потом экспортировал ее вsql