我自己简单写了一个cout,但是在out<<std::endl的时候出错了,要怎么才能使我的out像cout一样能用endl
template<class _Elem,
class _Traits> inline
basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
这是std里对endl的实现,可以看到它里面有两步 先输出换行符'\n' 然后flush对缓存区进行刷新。其实你可以直接out<'\n';就可以换行
或者你自己的out继承一下ostream,但是这样做可能会有个问题 就是<< 操作符也需要支持重载才行。还有一种方式是你自己写一个endl在你的
out里,用名空间和cout的endl进行区分
/** Thread safe cout class
* Exemple of use:
* PrintThread{} << "Hello world!" << std::endl;
*/
class PrintThread: public std::ostringstream
{
public:
PrintThread() = default;
~PrintThread()
{
std::lock_guard<std::mutex> guard(_mutexPrint);
std::cout << this->str();
}
private:
static std::mutex _mutexPrint;
};
std::mutex PrintThread::_mutexPrint{};
https://blog.csdn.net/autumn20080101/article/details/51798677