Я видел множество аргументов, что использование возвращаемого значения предпочтительнее, чем параметры out. Я убежден в причинах, по которым их следует избегать, но я не уверен, сталкиваюсь ли я со случаями, когда это неизбежно.
Часть первая моего вопроса: каковы ваши любимые / распространенные способы обойти использование параметра out? Вещи по линии: Человек, в рецензиях я всегда вижу, как другие программисты делают это, когда они могли бы легко сделать это таким образом.
Часть вторая моего вопроса касается некоторых конкретных случаев, с которыми я столкнулся, когда я хотел бы избежать параметра out, но не могу придумать, как это сделать.
Пример 1:
У меня есть класс с дорогой копией, которую я хотел бы избежать. Работу можно выполнить над объектом, и это делает объект дорогим для копирования. Работа по сбору данных также не совсем тривиальна. В настоящее время я передам этот объект в функцию, которая будет изменять состояние объекта. Для меня это предпочтительнее, чем создавать новый объект внутри рабочей функции и возвращать его обратно, поскольку это позволяет мне хранить вещи в стеке.
class ExpensiveCopy //Defines some interface I can't change.
{
public:
ExpensiveCopy(const ExpensiveCopy toCopy){ /*Ouch! This hurts.*/ };
ExpensiveCopy& operator=(const ExpensiveCopy& toCopy){/*Ouch! This hurts.*/};
void addToData(SomeData);
SomeData getData();
}
class B
{
public:
static void doWork(ExpensiveCopy& ec_out, int someParam);
//or
// Your Function Here.
}
Используя мою функцию, я получаю код вызова следующим образом:
const int SOME_PARAM = 5;
ExpensiveCopy toModify;
B::doWork(toModify, SOME_PARAM);
Я бы хотел что-то вроде этого:
ExpensiveCopy theResult = B::doWork(SOME_PARAM);
Но я не знаю, возможно ли это.
Второй пример:
У меня есть массив объектов. Объекты в массиве являются сложным типом, и мне нужно выполнить работу над каждым элементом, работу, которую я хотел бы отделить от основного цикла, который обращается к каждому элементу. Код в настоящее время выглядит так:
std::vector<ComplexType> theCollection;
for(int index = 0; index < theCollection.size(); ++index)
{
doWork(theCollection[index]);
}
void doWork(ComplexType& ct_out)
{
//Do work on the individual element.
}
Любые предложения о том, как справиться с некоторыми из этих ситуаций? Я работаю в основном на C ++, но мне интересно узнать, облегчают ли другие языки установку. Я столкнулся с RVO в качестве возможного решения, но мне нужно прочитать о нем больше, и это звучит как особенность компилятора.