重载运算符 C++ 时的优先级
Precedence while overloading operators C++
我有一个 class,我在其中重载了一些运算符。我的代码是这样的:
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)
因为我想将我的代码用作库,所以我的意图是最终用户可以灵活地在一行中编写所有内容。
您运行遇到了 sequence points 的问题。如果您想 运行 以保证顺序插入,则必须使用
myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;
好的,让我们简化和分解这里发生的事情。您调用的第一部分的计算结果如下:
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)
我的心理问题阅读技巧告诉我你的 class 同时具有 operator<<
和 operator+
并且 operator+
是某种class 上的状态操纵器,您希望在将 12 和 14 插入流后发生。
那样的话....不要那样做。这不是 operator+
的目的,也不是标准流使用操纵器的原因。
但如果你绝对坚持:(myClass << 12 << 14) +18 << 36 << 14 << 47
我有一个 class,我在其中重载了一些运算符。我的代码是这样的:
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)
因为我想将我的代码用作库,所以我的意图是最终用户可以灵活地在一行中编写所有内容。
您运行遇到了 sequence points 的问题。如果您想 运行 以保证顺序插入,则必须使用
myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;
好的,让我们简化和分解这里发生的事情。您调用的第一部分的计算结果如下:
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)
我的心理问题阅读技巧告诉我你的 class 同时具有 operator<<
和 operator+
并且 operator+
是某种class 上的状态操纵器,您希望在将 12 和 14 插入流后发生。
那样的话....不要那样做。这不是 operator+
的目的,也不是标准流使用操纵器的原因。
但如果你绝对坚持:(myClass << 12 << 14) +18 << 36 << 14 << 47