У меня есть класс, в котором я перегружен некоторыми операторами. Мой код такой:
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)
Потому что я хочу использовать свой код в качестве библиотеки, поэтому я хочу, чтобы конечный пользователь мог гибко писать все в одной строке.
Итак, давайте упростим и разберем то, что здесь происходит. Первая часть вашего звонка оценивается примерно так:
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
Вы столкнулись с проблемой с последовательность точек. Если вы хотите запустить вставки в гарантированном порядке, вам придется использовать
myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;