Приоритет при перегрузке операторов Переполнение стека

У меня есть класс, в котором я перегружен некоторыми операторами. Мой код такой:

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

Где оператор () перегружен, массив — это массив чисел, а 10 — длина массива. Я делаю это, потому что мне нужен какой-то способ сохранить длину массива, но проблема в том, что myClass(array,10) выполняется раньше myClass << 12 , Итак, в этом случае я хочу сначала поставить 12 в поток, а затем мои массивы чисел, и мне нужно знать его длину.

И я не хочу использовать это решение:

myClass << 12
myClass << myClass(array,10)

Потому что я хочу использовать свой код в качестве библиотеки, поэтому я хочу, чтобы конечный пользователь мог гибко писать все в одной строке.

-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

2

Другие решения

Вы столкнулись с проблемой с последовательность точек. Если вы хотите запустить вставки в гарантированном порядке, вам придется использовать

myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;
0

По вопросам рекламы [email protected]