我有一个班级,我已经重载了一些运算符。我的代码是这样的:
myClass << 12 << 14 << 21 << 44
效果很好,首先运行myClass << 12
,然后运行myClass << 14
。
但如果我尝试这样做,我会遇到问题:
myClass << 12 << 14+18 << 36 << 14 << 47
运算符+
也被重载,问题是14+18
在myClass << 12
之前运行。我真的需要先执行myClass << 12
然后14+18
。我怎样才能做到这一点?
编辑:
我想将一些数字和数组放入流中。数字的一部分得到了解决。至于数字数组,我做的是这样的事情:
myClass << 12 << myClass(array,10) << 21 << 19
如果运算符()
被重载,则array是数字数组,10是数组的长度。我这样做是因为我需要某种方法来保持数组的长度,但问题是myClass(array,10)
在myClass << 12
之前执行。所以,在这种情况下,我首先要将12
放入流中,然后放入我的数组,我需要知道它的长度。
而且,我不想使用这个解决方案:
myClass << 12
myClass << myClass(array,10)
因为我想将我的代码用作库,所以我的意图是最终用户可以灵活地在一行中编写所有内容。
答案 0 :(得分:2)
好的,让我们简化并分解这里发生的事情。通话的第一部分评估为:
myClass << 12 << myClass(array,10)
变为myClass.operator<<(12).operator<<(myClass(array, 12)
,当理论上拼写出隐含的this
参数时,会变成operator<<(operator<<(myClass, 12), myClass(array, 10))
现在,标准对执行operator<<(myClass, 12)
和myClass(array, 10)
的顺序所说的唯一内容是两者都将在最外面的operator<<
被调用之前执行。在您的情况下,它选择首先执行operator()
。
现在,我们如何实现您想要的结果?首先,您可以将单个语句的部分放入多个语句中以强制执行所需的顺序。
或者,您可以完全不同地处理数组。我建议format_array
函数:
std::string format_array(array, 10)
{
// Do stuff
return string representation of array
}
myClass << 12 << format_array(array,10) << 21 << 19
基于不同问题的原始答案措辞:
因为你不能超载operator+(int, int)
我的心理问题阅读技巧告诉我你的班级有operator<<
和operator+
,而operator+
是某种状态您的类上的操作符,您希望在将12和14插入到流中后发生。
在那种情况下.... 不要那样做。这不是operator+
的原因,也不是标准流使用操纵器的原因。
但如果你绝对坚持:(myClass << 12 << 14) +18 << 36 << 14 << 47
答案 1 :(得分:0)
您遇到了sequence points的问题。如果要以保证顺序运行插入,则必须使用
myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;