需要某种运算符.. c ++

sam*_*ami 4 c++

我想在队列中存储一串字符串.如果我使用成员函数,这似乎很简单push()

queue test;
string s0("s0"), s1("s1");

test.push(s0);
test.push(s1);
Run Code Online (Sandbox Code Playgroud)

我正在考虑以隐式方式在队列中添加字符串.这意味着,如果我键入以下字符串序列,则operator >>应该将队列中的字符串值推送出来.

queue test;
string s0("s0"), s1("s1");

s0 >> s1 >> s2 >> s3 ;
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

sbi*_*sbi 16

虽然C++不允许你这样做,它允许你做一些非常相似的事情:test << s0 << s1;但是,不要这样做!

如果我看到test.push(s0),我确切地知道它的作用,甚至没有看到它的类型test.如果我看到test << s0 << s1;,我认为test是一个写入的流.


这是我在重载运算符时应遵循三个基本规则:

  1. 尽管看似明显的相反证据,但只有极少数情况下运营商超载是合适的.因此,重心运营商的第一个也是最重要的规则是:不要这样做.这可能看起来很奇怪,但原因是实际上很难理解运算符应用背后的语义,除非在应用程序域中使用运算符是众所周知且无可争议的.与普遍认为相反,情况并非如此. 只要操作员的意义不明显且无可争议,就不应该超载.相反,提供具有良好选择名称的功能.
  2. C++对重载运算符的语义几乎没有限制.您的编译器将很乐意接受实现二元+运算符的代码来更改其右操作数.但是,这样的运算符的用户永远不会怀疑表达式a + b改变了值b.这就是为什么运算符重载的第二条规则说:始终坚持运算符的众所周知的语义.(反过来,这假定语义是无可争议的;请参阅先前的规则.)
  3. 最后,始终记住运营商彼此之间以及与其他运营相关.如果您的类型支持a + b,用户也可以打电话a += b.如果它支持前缀增量++ a,那么他们也希望++能够工作.如果他们可以检查是否a < b,他们肯定也希望能够检查是否a > b.如果他们可以复制构造您的类型,他们希望分配也可以工作.因此,运算符重载的第三条规则提醒您:始终提供一组相关操作.

与所有此类规则一样,确实存在例外情况.有时人们偏离了它们,结果并不是错误的代码,但这种偏差很少而且很远.至少,我所看到的100个这样的偏差中有99个是没有道理的.然而,它可能只有1000中的999.所以你最好坚持这些规则.

所以万一我还不够清楚:对于你问题的代码,偏离这些规则是非常糟糕的.