Мне нужно выводить сообщения как в консоль, так и в файлы журналов.
После поиска в Google я изучил концепцию «teebuf», которая в основном создает пользовательский класс, унаследованный от basic_streambuf. Это прекрасно работает, но как правильно очистить перенаправленный буфер. Я имею в виду, как реализовать RAII для буфера «tee», поэтому мне не нужно беспокоиться об этом каждый раз, когда мне нужно выйти из программы.
замечание: в настоящее время использование библиотеки Boost не вариант для меня.
Сегмент кода
int main() {
std::streambuf* cout_sbuf = std::cout.rdbuf();
std::ofstream fout(fileOutDebug);
teeoutbuf teeout(std::cout.rdbuf(), fout.rdbuf());
std::cout.rdbuf(&teeout);
// some code ...
if (failed) {
std::cout.rdbuf(cout_sbuf); // <-- i once comment this and it gives error
return -1;
}
// some more code ...
std::cout.rdbuf(cout_sbuf); // <-- i once comment this and it gives error
return 0;
}
Сегмент кода (Моя пробная реализация, но не удалось)
template < typename CharT, typename Traits = std::char_traits<CharT>
> class basic_tostream : std::basic_ostream<CharT, Traits>
{
public:
basic_tostream(std::basic_ostream<CharT, Traits> & o1,
std::basic_ostream<CharT, Traits> & o2)
: std::basic_ostream<CharT, Traits>(&tbuf),
tbuf(o1.rdbuf(), o2.rdbuf()) {}
void print(char* msg);
private:
basic_teebuf<CharT, Traits> tbuf; // internal buffer (tee-version)
};
typedef basic_tostream<char> tostream;
int main() {
std::ofstream fout(fileOutDebug);
tostream tee(std::cout, fout, verbose);
tee << "test 1\n"; // <-- compile error
tee.print("sometext"); // <-- comment above and it run fine, both file and console written
}
Сообщение об ошибке: «std :: basic_ostream» является недоступной базой «basic_tostream»
Вы должны использовать:
template < typename CharT, typename Traits = std::char_traits<CharT> >
class basic_tostream : public std::basic_ostream<CharT, Traits>
вместо:
template < typename CharT, typename Traits = std::char_traits<CharT> >
class basic_tostream : std::basic_ostream<CharT, Traits>
Ключевая разница public
, Вот что 'std::basic_ostream' is an inaccessible base of 'basic_tostream'
сообщение об ошибке о.
Других решений пока нет …