Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заглушка на ostream, направить данные в никуда :) 
V
    Опции темы
azesmcar
Дата 15.4.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Добрый день,

Программе нужно логирование данных на трех уровнях (debug, normal, error only), чтобы не писать каждый раз проверку типа этого
Код

if (logLevel() == LogLevel_DEBUG)
   log().stream() << "Log information" << std::endl;

хочу чтобы сама функция, возвращающая ссылку на поток ostream вернула какую нибудь пустышку, если debug logging отключен из конфигурации. Т.е.
Код

std::ostream& Billing::Logger::logger(ubyte level)
{
    if (level <= LogLevel::current())
    {
        static std::ofstream output(LOG_FILE, std::ios::app);

        output << "[" << boost::posix_time::second_clock::local_time() << "] ";
        return output;
    } else
    {
        // вот тут надо бы вернуть пустышку
        return nullstream();
    }
}

один из дурацких вариантов реализации (первое что пришло в голову) - это вернуть std::stringstream, но заливать всю дебаг информацию в память не самая лучшая идея.
Можно конечно наследовать ofstream, но операторы не виртуальны. В общем то можно в конечном счете написать шаблонные адаптеры на ostream и работать с ними, но не хочется..может можно придумать что нибудь поэлегантней.

Спасибо.

Это сообщение отредактировал(а) azesmcar - 15.4.2010, 14:15
PM   Вверх
Alca
Дата 15.4.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

return std::ostream os(0);
 ?


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 15.4.2010, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Alca

Да, забыл сказать, этот вариант я конечно проверял..он рабочий (в VS), но я не уверен что он будет работать на любой платформе.
Так как конструктор принимает basic_streambuf *, где гарантии что библиотека будет проверять на NULL перед использованием?
Сейчас поищу в стандарте.
PM   Вверх
Alca
Дата 15.4.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Код

    std::ostream os(/*streambuf * */ sbSmall);
    os.flush();
    //os.clear();
return os;


Это сообщение отредактировал(а) Alca - 15.4.2010, 14:31


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 15.4.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

void init(basic_streambuf<charT,traits>* sb);
Postconditions
rdstate() - goodbit if sb is not a null pointer, otherwise badbit.

т.е. на NULL проверка делается по стандарту.

все, спасибо.
PM   Вверх
boostcoder
Дата 15.4.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



еще вариант, вернуть объект std::ostream который открыл "/dev/null". linux only smile
PM WWW   Вверх
azesmcar
Дата 15.4.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  15.4.2010,  15:20 Найти цитируемый пост)
еще вариант, вернуть объект std::ostream который открыл "/dev/null". linux only smile 

 smile этот вариант я тоже обдумывал..но нужно кросс-платформенное решение.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.