c++ - 如何将 ostream 重定向到 Boost Log 库

标签 c++ boost

我有一个进度条函数,它将 std::ostream 作为参数。出于描述的目的,我在这里对其进行了简化。

void someprogressbar(std::ostream & stream)
{
    stream << "Hello";
}

我无法修改此功能,因为它是第三方功能。我用 std::ostringstream myoss; someprogressbar(myoss) 调用这个函数或 someprogressbar(std::cout) .该函数会在我的程序进行时实时打印一些信息。

如何将输出重定向到 Boost Log 库?我能做到BOOST_LOG_TRIVIAL(debug) << "Hello" , 但做不到 someprogressbar(BOOST_LOG_TRIVIAL(debug))) .

最佳答案

为了通过 ostream 将输出重定向到 Boost 记录器,我需要使用 Boost Iostreams 库创建一个接收器。感谢@sehe 的提示!

我在以下实现中使用 C++11:

#include <iosfwd>
#include <boost/iostreams/categories.hpp>

class Logger_Sink
{
public:

    typedef char char_type;
    typedef boost::iostreams::sink_tag category;

    Logger_Sink() = default;

    virtual
    ~Logger_Sink() = default;

    virtual
    std::streamsize
    write(
            char_type const * s,
            std::streamsize   n) = 0;
};

class cout_Sink: public Logger_Sink
{
public:

    std::streamsize
    write(
            char_type const * s,
            std::streamsize   n)
    {
        BOOST_LOG_TRIVIAL(info) << std::string(s, n);
        return n;
    }
};

然后,我需要使用这个接收器来创建一个 ostream:

#include <iostream>
#include <boost/iostreams/stream.hpp>
namespace io = boost::iostreams;

io::stream_buffer<cout_Sink> cout_buf((cout_Sink()));

std::ostream mycout(&cout_buf);

关于c++ - 如何将 ostream 重定向到 Boost Log 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958520/

相关文章:

c++ - 在指向 wstring 的指针上使用 [ ] 运算符访问元素

c++ - 初始化随机生成器的最佳位置

c++ - 如何访问网络文件?

c++ - 使用 Boost 序列化和反序列化 JSON

c++ - 如何检查模板类型是否是变体类型的类型之一?

c# - Windows Mobile - 停止主手机应用程序

c++ - 如何在VC++中使用.lib、.dll和.exp文件?

c++ - 如何确定boost的静态库路径?

c++ - Boost/STL 在高性能计算方面是否慢?

c++ - 用消息 boost static_assert?