使用rdbuf() - > sputn(...)vs operator<<

时间:2012-11-12 14:59:00

标签: c++ iostream std

我正在查看一些遗留代码,发现在整个代码中大量使用临时std::string对象来转换const char*以强制使用:

inline std::ostream & operator << (std::ostream & s, const std::string & str)

其中str.c_str()用于实现对

的调用
template<class _Traits> inline
    basic_ostream<char, _Traits>& __CLRCALL_OR_CDECL operator<<(
        basic_ostream<char, _Traits>& _Ostr,
        const char *_Val)
奇怪的是我觉得这样做是因为有人创建了一个const char *插入操作符,它被递归...无论如何,原因在昏暗的遥远的过去中丢失了......当我注意到发生的事情时,我删除了它并且一切正常(AFAIK)。

在尝试此问题时,我重新定义了operator<<(std::ostream& , const char*)以执行以下操作。

//
// Disclaimer - experiment!!! not enshrined in code.
//
inline std::ostream & operator << (std::ostream & s, const char * str)
{
   //formerly return s << std::string(str);

   if( str ) s.rdbuf()->sputn( str , strlen(str) );
   return s;
}

问题 的 除了strlen调用(抢占一些注释)之外,绕过插入运算符还有很多不足之处吗? (我在运算符中看到了一些尝试捕获逻辑我绕过了,我可能会把它放到上面的运算符中。)

1 个答案:

答案 0 :(得分:1)

流插入器执行格式化输入,由流对象中的一些标志控制。将字符直接填充到输出缓冲区中会绕过此格式,因此setw等操纵符不会影响输出。