c++ - 禁用 boost 的 `progress_display` 输出

标签 c++ boost

我有一个使用 progress_display 来显示加载条的函数。我希望能够禁用输出以进行测试。加载栏打印它被初始化的第二个,如果我在 if 语句中初始化它,我会从另一个 if 语句中调用 ++loading_bar; 得到一个错误。

我想知道我是否可以通过使用我自己的什么都不做的流初始化它来禁用它,但我不知道我将如何做到这一点。

#include <boost/progress.hpp>
int myfuntion(bool silent)
{
  int computations = 100;
  boost::progress_display loading_bar(computations);
  ++loading_bar;
}

最佳答案

您必须在构造函数中传递一个派生自 std::ostream 的对象,并且 progress_display 存储一个引用,因此之后无法更改它。

正如您所说,您可以创建自己的对象来控制输出,但它必须符合:

  • 它必须派生自 std::ostream
  • 它的持续时间必须与 progress_display 的持续时间相同。

您可能会找到更多信息here关于 std::ostream 的派生。基于链接,您可以定义以下 struct;

struct Output : std::ostream, std::streambuf
{
    Output(bool enabled) : std::ostream(this), m_enabled(enabled) {}

    int overflow(int c)  {
        if(m_enabled) std::cout.put(c);
        return 0;
    }

    bool m_enabled;
};

现在,如果您将 progress_display 声明为:

,则此 struct 可以启用/禁用其构造函数的输出:
// Visible progress
Output out_enabled(true);
boost::progress_display loading_bar_visible(computations, out_enabled);

// Invisible progress
Output out_disabled(false);
boost::progress_display loading_bar_invisible(computations, out_disabled);

关于c++ - 禁用 boost 的 `progress_display` 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027707/

相关文章:

c++ - 如何将返回类型声明为模板类型名的内部类?

c++ - 如何使用 Casablanca 在现有的 web::json::value 对象中附加新的键值对?

c++ - 在 autoconf 中检查仅 header 库

c++ - boost::scoped_lock 似乎没有锁定 std::cout

c++ - 枚举多个文件,或多个文件的自动唯一常量

c++ - Boost:反序列化通过 ZeroMQ pull socket 传递的自定义 C++ 对象

c++ - 使用命名捕获找出给定正则表达式中命名组的所有名称

c++ - 获取指向列表中对象的永久指针

c++ - boost asio多播重新加入一个组

c++ - 使用 std::visit 和已删除函数的专门化