我在记录器类中使用ostream时遇到问题。出于某种原因,std :: endl永远不会打印出来,因此不会添加换行符。我确信有什么问题,我在尝试理解如何在我自己的课程中使用我的ostream时遇到了问题,所以我可能做了一些基本错误的事情。
class MyStreamBuf : public std::streambuf
{
public:
MyStreamBuf() : std::streambuf()
{
}
};
class MyLogger : public std::ostream
{
public:
MyLogger(MyStreamBuf* buf) : std::ostream(buf) { mBuf = buf; }
~MyLogger() { delete mBuf; }
template <typename T>
inline MyLogger& operator << (T const& value)
{
#ifdef _WIN32 || _WIN64
std::cout << value;
#endif
return *this;
}
inline std::ostream& operator << (std::ostream& (*f)(std::ostream&))
{
return f(*this);
}
MyStreamBuf* mBuf;
};
int _tmain(int argc, _TCHAR* argv[])
{
MyStreamBuf* buf = new MyStreamBuf();
MyLogger logger(buf);
logger << "kekekek" << "asdf: " << 23 << std::endl;
logger << "kekekek" << "asdf: " << 23 << std::endl;;
getchar();
return 0;
}
输出:
kekekekasdf: 23kekekekasdf: 23
答案 0 :(得分:3)
使用自定义流缓冲类时,您已获得正确的基本方法。但是,这是您要实现特定逻辑而不是从std::ostream
派生的类的地方!
只是为了解释当前发生的情况:当您致电f(*this)
时,调用函数f()
并使用std::ostream
基础接收输出并调用flush()
。你的课完全没有了。
这是你应该做的:
*从MyLogger
类中删除输出运算符
*在流缓冲区中实现overflow()
以处理溢出缓冲区(例如,在某处发送字符或增加缓冲区)
*实现sync()
以发送任何缓冲的字符,并在刷新流时执行您需要执行的任何操作
*可能MyLogger
应拥有流缓冲区并正确设置其花瓶;通常这是一个派生自std::ostream
的类
有很多例子说明了这一点。搜索streambuf
和James Kanze或我找一对夫妇。
答案 1 :(得分:2)
试试这个:
inline std::ostream& operator << (std::ostream& (*f)(std::ostream&))
{
std::cout << f;
return *this;
}
答案 2 :(得分:1)
您需要将endl发送到某个地方。通过执行f(*this)
,您尝试将其发送给自己,但您的对象没有必要的方法来执行此操作。如果您查看#include <ostream>
,则函数endl
会使用函数put
将\n
放入流中,然后将其刷新。
你需要在某处写下终点线。例如,如果您正在写cout
,那么您可以执行
(*f)(std::cout);