我一直在使用Petru's logging framework。这是他的代码的一部分:
class Output2FILE
{
public:
static FILE*& Stream() {
static FILE* pStream = stderr;
return pStream;
}
};
这是非常好的,因为它只是在没有任何操作的情况下记录到stderr,但是随后可以将函数设置为包括stdout和文件在内的任何内容。但是,我认为这种方法不能用于格式化数据,因为需要使用fprintf。
因此,我试图想出一些类似的东西,让我们默认使用stdout并且可以切换到文件,但是使用“<<”格式化数据的运算符。
也许是
的内容std::ostream myOutput(std::cout);
然后做myOutput << "Hello" << 1 << 1.5;
的想法。然而,上面的行使编译器抱怨。
正确的方法是什么?
谢谢!
答案 0 :(得分:1)
您可以使用指向std::ostream
的指针,就像FILE*
版本一样。
std::ostream* os = &std::cerr;
if (log_to_file) {
os = new std::ofstream("my.log");
}
*os << "Hello Log!" << std::endl;
if (log_to_file) { // or less 'safe' os != &std::cerr ...
// close file here
}
答案 1 :(得分:1)
简单回答,真的
std::ostream& myOutput(std::cout);
由于
答案 2 :(得分:0)
我不太确定我理解你正在寻找什么。但似乎这个可以帮助你:
#include <sstream>
#define SSTR( x ) ( dynamic_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
用法:
SSTR( "Hello" << 1 << 1.5 );
产生std :: string(然后你可以输入你想要的任何输出函数)。
详细说明和解释:http://dev.rootdirectory.de/trac.fcgi/wiki/SSTR%28%29