Bri*_*ore 4 c++ string cout operator-overloading ostream
我想超载
<<
运营商.例如
cout << a <<""<< b <<""; //我不允许改变这一行
我必须以格式打印它
<literal_valueof_a><"\n>
<literal_valueof_b><"\n">
<"\n">
Run Code Online (Sandbox Code Playgroud)
我试图重载<<运算符给字符串作为参数,但它不起作用.所以我想文字
""
不是一个字符串.如果不是那么它是什么.以及如何超载?请帮助;
完整代码
//Begin Program
// Begin -> Non - Editable
#include <iostream>
#include <string>
using namespace std;
// End -> Non -Editable
//---------------------------------------------------------------------
// Begin -> Editable (I have written )
ostream& operator << (ostream& os, const string& str) {
string s = " ";
if(str == " ") {
os << '\n';
}
else {
for(int i = 0; i < str.length(); ++i)
os << str[i];
}
return os;
}
// End -> Editable
//--------------------------------------------------------------------------
// Begin -> No-Editable
int main() {
int a, b;
double s, t;
string mr, ms;
cin >> a >> b >> s >> t ;
cin >> mr >> ms ;
cout << a << " " << b << " " ;
cout << s << " " << t << " " ;
cout << mr << " " << ms ;
return 0;
}
// End -> Non-Editable
//End Program
Run Code Online (Sandbox Code Playgroud)
输入和输出输入
30 20 5.6 2.3 hello world
Run Code Online (Sandbox Code Playgroud)
产量
30
20
5.6
2.3
hello
world
Run Code Online (Sandbox Code Playgroud)
" "
是一个长度为1的字符串文字,因此具有类型const char[2]
.std::string
没有关系.
从理论上讲,你可以将它重载为:
auto& operator<<(std::ostream& os, const char (&s)[2]) {
return os << (*s == ' ' && !s[1] ? +"\n" : +s);
}
Run Code Online (Sandbox Code Playgroud)
虽然这胜过所有其他重载,但现在事情变得非常毛茸茸.问题是some_ostream << " "
,即使在模板中也可能并不罕见,现在不再解析为调用标准函数.这些模板现在在受影响的翻译单元中具有与在不受影响的翻译单元中不同的定义,因此违反了单定义规则.
最好修改当前流式空格字符的代码.
或者,编写您自己的流缓冲区,根据需要将其转换为换行符.