Есть ли способ выполнить функцию обратного вызова или иным образом вызвать предопределенную функцию всякий раз, когда данные записываются в стандартный поток, такой как stderr
или же stdout
? В идеале это можно использовать, чтобы приложение могло выводить как обычно с printf
в случае stdout
или же fprintf
для других FILE
потоки, и условно выполнять дополнительные задачи, такие как утверждение в зависимости от текущих настроек. Это может иметь преимущество автоматического запуска этого кода обработки ошибок, когда другие библиотеки выводят в поток.
Я знаю, что выход stderr
а также stdout
может быть перенаправлен на другой FILE
обрабатывает с помощью std::freopen
, Практично ли реализовать альтернативный FILE
поток, который обеспечивает такое поведение, или это потребует повторной реализации большого количества стандартных библиотечных функций?
Были бы предпочтительны совместимые со стандартами предложения C ++ (включая C ++ 11), хотя я был бы открыт для решений только для Windows, если это необходимо.
С тех пор у меня была попытка реализовать потоковый буфер, как это было предложено думстера, с небольшой помощью Фильтрация Streambufs Джеймсом Канзе. Если не появятся какие-либо другие предложения, кажется, что это самое близкое к исходному предложению. Он не будет перехватывать вывод в стиле C, который, как я подозреваю, либо невозможен, либо непрактичен, но в остальном обеспечивает все необходимые мне функции.
Вы можете заменить потоковый буфер для перехвата любого вывода в эти потоки, см. Функцию rdbuf (). Я думаю, что вам нужно только реализовать функцию overflow () в классе streambuffer.
Других решений пока нет …