我想创建一个灵活的记录器类。我希望它能够将数据输出到文件或标准输出。另外,我想使用流。该类应该类似于:
class Logger
{
private:
std::ostream m_out; // or ofstream, iostream? i don't know
public:
void useFile( std::string fname);
void useStdOut();
void log( symbol_id si, int val );
void log( symbol_id si, std::string str );
//etc..
};
The symbol_id
是一个枚举并定义格式。我想要实现的是能够轻松地从标准输出切换到文件,反之亦然(这是use*
方法)。最好只使用m_out
并简单地写m_out << "something";
没有任何检查我是否想写入文件或标准输出。
我知道有很多方法可以解决这个问题 (using if's
测试我是否想写入文件或标准输出,“C 方式”(使用FILE*
and fprintf
)) 等等,但我确信一定有一种方法可以用 C++ 流以一种很好的方式实现这一点。但我似乎无法找到如何做到这一点的方法。有人可以帮我吗?
The std::o*stream
C++ 中的类继承自 std::ostream。这意味着您应该根据 std::ofstream 指针或引用来编写接口:
class Logger
{
std::ostream *m_out; // use pointer so you can change it at any point
bool m_owner;
public:
// constructor is trivial (and ommited)
virtual ~Logger()
{
setStream(0, false);
}
void setStream( std::ostream* stream, bool owner )
{
if(m_owner)
delete m_out;
m_out = stream;
m_owner = owner;
}
template<typename T>
Logger& operator << (const T& object)
{
if(!m_out)
throw std::runtime_error("No stream set for Logger class");
(*m_out) << object;
return *this;
}
};
// usage:
Logger logger;
logger.setStream( &std::cout, false ); // do not delete std::cout when finished
logger << "This will be logged to std::cout" << std::endl;
// ...
logger.setStream(
new std::ofstream("myfile.log", std::ios_base::ate|std::ios_base::app),
true ); // delete the file stream when Logger goes out of scope
logger << "This will be appended to myfile.log" << std::endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)