LINUX.ORG.RU

ostream в плюсах

 ,


0

3

Я обречён страдать, как я понимаю, но есть ли варианты получше, чем тут

Требования просты. Передать ostream-like объект в мой класс, чтобы перенаправить вывод туда. Под ostream может быть как ofstream, так и std::cout.

В идеале что-нибудь типа Qt'шного QTextStream, но у меня только std и boost в распоряжении.

★★★★★

Последнее исправление: UVV (всего исправлений: 2)

И в чём сложность? Передавай std::ostream& как параметр и используй его внутри полиморфно

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

В том, где его хранить.

UVV ★★★★★
() автор топика

Я кажется придумал. Может кому будет интересно.

В членах класса будет std::ofstream. Добавлю следующий метод:

std::ostream& outputStream()
{
   return mOutputFile.empty() ? std::cout : mOutputStream;
}
и во все нужные фукнции буду передовать то, что он вернёт. Проблема с владением тоже вроде бы решается.

Идею подчерпнул отсюда

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)

std::stringstream? Но придется вручную выводить его куда надо.

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

Костыльно конечно, но можно немного приукрасить завернув ostream& и unique_ptr в класс оберктку

anonymous
()

OMG! вы совсем обленились, программисты, билят. Напиши ты обертку, которая может или шаредптр или ссылку или указатель.

anonymous
()
Ответ на: комментарий от rumgot

std::string

Но я в конечном варианте исправил на mOutputStream.is_open()

UVV ★★★★★
() автор топика

aido

Ты до сих пор библиотеку для логгирования ищешь?

Там немножко требования поменялись. API у нас будет свой, а к backend'ам я сильно пристально не присматривался пока. Но этот вопрос из другой оперы был =)

UVV ★★★★★
() автор топика

в чем проблема юзать просто указатель?

f1u77y ★★★★
()

Вопрос всем, а можно ли как-то создать вручную объект/объекты потока, который/которые будет/будут вместо cin/cout/cerr ?

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

а можно ли как-то создать вручную объект/объекты потока, который/которые будет/будут вместо cin/cout/cerr ?

Вместо это врядли. Но самим объектам можно назначить другой ostream вызовом

rdbuf() - получить

rdbuf(std::ostream&) - переназначить.

anonymous
()
Ответ на: комментарий от anonymous
#include <iostream>
#include <sstream>
 
int main()
{
    std::ostringstream local;
    auto cout_buff = std::cout.rdbuf(); // save pointer to std::cout buffer
 
    std::cout.rdbuf(local.rdbuf()); // substitute internal std::cout buffer with
        // buffer of 'local' object
 
    // now std::cout work with 'local' buffer
    // you don't see this message
    std::cout << "some message";
 
    // go back to old buffer
    std::cout.rdbuf(cout_buff);
 
    // you will see this message
    std::cout << "back to default buffer\n";
 
    // print 'local' content
    std::cout << "local content: " << local.str() << "\n";
}

http://en.cppreference.com/w/cpp/io/basic_ios/rdbuf

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