我需要创建一个调试ofstream,其功能如下:
#define DEBUG true
int main() {
debug << "Hello World\n";
}
上述情况中的输出应为:Hello World
以下代码 -
#define DEBUG false
int main() {
debug << "Hello World\n";
}
输出应为空。 任何建议我应该如何进行。
答案 0 :(得分:0)
正如我从您的问题中所理解的那样,您希望有一个单独的调试流(与std::cout
和std:cerr
相反)。
你可以通过制作一个&#34; null流来实现这一目标。只是吃掉一切,什么都不做。
如果您的编译器足够聪明,那么它最终应该删除大部分内容。
class NullStream {};
template<typename T>
NullStream& operator<<(NullStream& s, T const &) { return s; }
NullStream& operator<<(NullStream& s, std::ostream&(std::ostream&)) { return s; }
现在,根据您的宏,您决定是使用NullStream
还是使用实际ostringstream
。
#if DEBUG
std::ostringstream debug;
#else
NullStream debug;
#endif
像这样测试:
debug << "Hello World\n";
debug << 12345 << "\n";
debug << "Test" << std::endl;
#if DEBUG
std::cout << "Debug:" << std::endl;
std::cout << debug.str() << std::endl;
#endif
如果DEBUG
不是0
,则会产生:
调试:
Hello World
12345
测试
请注意,NullStream
本身并没有任何std::ostream
的功能,因此另一种解决方案可能是从std::ostream
派生并丢弃任何输入接收。
答案 1 :(得分:0)
根据您的使用情况,我认为debug
需要是宏观的,因为没有其他方法可以获取DEBUG
的值。一个简单的定义是:
#define debug (debugstream << enable<DEBUG>)
extern std::ostream debugstream;
template <bool Enable>
std::ostream& enable(std::ostream& out) {
if (Enable) {
out.clear();
}
else {
out.setstate(std::ios_base::badbit);
}
return out;
}
std::ostream debugstream(std::cout.rdbuf()); // probably defined in a separate translation unit
这里的技巧是使用流的starte来启用/禁用输出的打印:当流未处于良好状态时,无法生成输出(通过正确编写的输出运算符),即,{{1 }}或std::ios_base::failbit
已设置。可以通过使用std::ios_base::badbit
设置/取消设置流缓冲区来强制执行此行为。