我正在查看一些遗留代码,发现在整个代码中大量使用临时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
调用(抢占一些注释)之外,绕过插入运算符还有很多不足之处吗? (我在运算符中看到了一些尝试捕获逻辑我绕过了,我可能会把它放到上面的运算符中。)
答案 0 :(得分:1)
流插入器执行格式化输入,由流对象中的一些标志控制。将字符直接填充到输出缓冲区中会绕过此格式,因此setw
等操纵符不会影响输出。