微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确重新路由输出远离 std::cout?

如何解决如何正确重新路由输出远离 std::cout?

我多次听说,应该避免对 std::cout 进行简单的写入。 (这是正确的吗?)但是,我没有找到如何实现这一点的好例子。到目前为止,我想到的是:

#include <iostream>

class Logger {

    std::ostream os;

    auto RdBuffer( bool const decision ) { return decision ? std::cout.rdbuf() : nullptr; }

    public:
    explicit Logger( bool const use_cout = true ) : os( RdBuffer( use_cout ) ) {}
    void Print() {
        os << "Ptinting" << std::endl;
    }
};

它允许我在需要时写信给 std::cout,否则就保持沉。它似乎有效,但我不确定这是正确的方法。我特别担心的是 nullptr 的初始化以及在 bool 设置为 false 的情况下对其的连续写入。

这是否朝着正确的方向发展?我对实现这一目标的现代 C++ 方式特别感兴趣。因此非常感谢 C++11 或更新的答案。

编辑:更正了代码中的错字。

解决方法

我多次听说,应该避免对 std::cout 进行简单的写入。这是正确的吗?

没有。将输出写入标准输出流是公认的做法 - 除非您处于某种嵌入式设置中,或者使用输出处理方式非常不同的异国操作系统。

操作系统和其他进程希望输出写入该流,或写入它所代表的任何内容(例如类 Unix 系统上的标准输出文件句柄)。

到目前为止我想到的是这个[piece of code here]

嗯,

  1. 有几个流行的 C++ 日志库。 Here's a question about that 在 SoftwareRecs.SX 结束。如果您想要进行日志记录,则无需重新发明轮子。
  2. 正如@largest_prime_is_463035818 在他们的评论中所暗示的那样,通常只需传递一个 std::ostream 并写入它就足够了。当你不想在任何地方写作时——这也是可能的;阅读这些 SO 问题:

说了这么多 - 在 某些情况下,您可能合法地希望将 std::cout 本身重定向到其他地方打印。不过,我认为标准并未涵盖这一点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。