кортежи
Думаю, я согласен с вами, что вопрос о том, какая позиция соответствует какой переменной, может привести к путанице. Но я думаю, что есть две стороны. Один из них - сторона вызова , а другой - сторона вызова :
int remainder;
int quotient;
tie(quotient, remainder) = div(10, 3);
Я думаю, это кристально ясно, что мы получили, но это может сбить с толку, если вам придется возвращать больше значений одновременно. После того, как программист вызывающей стороны просмотрит документацию div
, он узнает, что это за позиция и может написать эффективный код. Как правило, я бы сказал, чтобы не возвращать более 4 значений одновременно. Для чего-то еще, предпочитаю структуру.
выходные параметры
Выходные параметры также можно использовать, конечно:
int remainder;
int quotient;
div(10, 3, "ient, &remainder);
Теперь я думаю, что это показывает, насколько кортежи лучше, чем выходные параметры. Мы смешали ввод div
с его выводом, но не получили никакого преимущества. Хуже того, мы оставляем читателя этого кода под сомнением относительно того, что может быть фактическим возвращаемым значением div
be. являются замечательными примерами, когда выходные параметры полезны. На мой взгляд, вы должны использовать их только тогда, когда у вас нет другого пути, потому что возвращаемое значение уже взято и не может быть изменено на кортеж или структуру. operator>>
является хорошим примером того, где вы используете выходные параметры, потому что возвращаемое значение уже зарезервировано для потока, поэтому вы можете связать operator>>
вызовы. Если вы не имеете дела с операторами, и контекст не совсем ясен, я рекомендую вам использовать указатели, чтобы сигнализировать на стороне вызова, что объект фактически используется в качестве выходного параметра, в дополнение к комментариям, где это уместно.
возвращая структуру
Третий вариант - использовать структуру:
div_result d = div(10, 3);
Я думаю, что это определенно выигрывает награду за ясность . Но учтите, что вам все еще нужно получить доступ к результату в этой структуре, и результат не «обнажается» в таблице, как это было в случае выходных параметров и кортежа, используемого с tie
.
Я думаю, что основной момент в наши дни - сделать все как можно более общим. Итак, скажем, у вас есть функция, которая может распечатывать кортежи. Вы можете просто сделать
cout << div(10, 3);
И ваш результат отображается. Я думаю, что кортежи, с другой стороны, явно выигрывают за их универсальный характер. Делая это с div_result, вам нужно перегрузить operator << или вывести каждый элемент отдельно. </p>