C++ - 将std :: ostream传递给函数

zbi*_*igh 3 c++ iostream ostream

我想到了C++中一个小的调试内联函数:

void inline debug( int debug_level, ostream& out ) {
    if ( debug_level <= verbosity ) {
        out.flush();
    }
    else {
        ostream tmp;
        tmp << out;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想如何使用它的一个例子:

_debug( 7, cout << "Something something" << someint << endl );
Run Code Online (Sandbox Code Playgroud)

然而它不能按照我计划的方式工作 - 我希望它只在详细级别高于或等于调试级别传递给函数时打印消息,但它似乎每次打印而不管调试级别如何,因此数据保持不变在cout缓冲区.到目前为止,我认为这个功能不是我最近的最好的想法,但我仍然想知道是否有办法清除与cout,cerr等相关的缓冲区.是否有可能让这种功能正常工作?

Kon*_*lph 6

如上所示使用宏,或者像这样:

struct nullstream : ostream {
    nullstream() : ostream(0) { }
};

ostream& dout(int debug_level, ostream& out = cerr) {
    static nullstream dummy;
    return debug_level <= verbosity ? dummy : out;
}

// …

dout(level) << "foo" << endl;
dout(level, cout) << "IMPORTANT" << endl;
Run Code Online (Sandbox Code Playgroud)

(使用endl也触发冲洗,无需手动冲洗!)