C ++流作为成员变量 [英] C++ stream as a member variable

查看:228
本文介绍了C ++流作为成员变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个C ++类,我想要保存用于日志记录的流。

I've got a C++ class which I would like to hold a stream used for logging.

流应该能够被设置

应该可以将流设置为 std :: cout 作为一个文件流记录到一个文件,或者作为一个字符串流,只是忽略数据(一个 / dev / null 排序)。在任何情况下,它应该是一个 ostream 类型对象,对象的创建者可以随时重置。

It should be possible to set the stream as std::cout, or as a file stream to log to a file, or as a stringstream which does nothing more than ignore the data (a /dev/null of sorts). In any case, it should be an ostream type object, which the creator of the object can reset at any time. The class itself is oblivious to the concrete stream type.

我可以通过指向ostream的指针来实现这一点,但是语法变得有点烦人,不得不使用deref运算符:

I could accomplish this with a pointer to an ostream, but then the syntax becomes a little annoying, having to use the deref operator:

(*m_log) << "message";

而不是

m_log << "message";

但是我不能使用引用,因为流对象需要在对象已经初始化。

But I can't use references, as the stream object needs to be possibly reset after the object has been initialized.

有没有一种优雅的方式来实现这一点,即避免使用指针,但仍然能够在构建之后重置?

Is there an elegant way to achieve this, i.e., avoid using pointers, but still be able to reset after construction?

推荐答案

您可以重置信息流:查看它 https:// ideone .com / Ci4eo

You can reset streams: see it live on https://ideone.com/Ci4eo

#include <fstream>
#include <iostream>
#include <string>

struct Logger
{
    Logger(std::ostream& os) : m_log(os.rdbuf()) { }

    std::streambuf* reset(std::ostream& os) 
    {
        return m_log.rdbuf(os.rdbuf());
    }

    template <typename T> friend Logger& operator<<(Logger& os, const T& t)
    { os.m_log << t; return os; }

    friend Logger& operator<<(Logger& os, std::ostream& ( *pf )(std::ostream&))
    { os.m_log << pf; return os; }

  private:
    std::ostream m_log;
};

int main(int argc, const char *argv[])
{
    Logger logto(std::cout);

    logto << "Hello world" << std::endl;

    logto.reset(std::cerr);
    logto << "Error world" << std::endl;

    return 0;
}

这篇关于C ++流作为成员变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆