Как я могу избежать выходных параметров при выполнении возврата?

Как мы знаем, что выходные параметры действительно плохо

 void foo(set<int> *x)

Здесь x — это ожидаемые параметры, это довольно распространенная практика в системных вызовах Linux.
Но для c ++ это не очень хорошая практика кодирования.

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

 a b
d e
f g
Possible combinations are:
a d f, a d g, a e f, a e g, etc...

list<list<string> > parameters;

Простое решение для возврата будет:

    void  getCombinations(list<list<string> > &param,
list<list<string> >::iterator it,
vector<string> &backtracker,
list<vector<string> > &output){

if(it == param.end()){
output.append(backtracker);
}
for(auto i = it->begin; i!= it->end(); i++){
backtracker.push_back(*i);
getCombinations(param, it+1, backtracker, output)
backtracker.pop_back();
}
}

Теперь, как я могу избежать выходных параметров здесь, чтобы я мог вернуть список вывода?

0

Решение

Выходные параметры все время отображаются в C ++. Однако вы можете инкапсулировать структуру выходных данных с помощью методов.

class ComboGenerator {
public:
void getCombinations(list<list<string> > &param,
list<list<string> >::iterator it,
vector<string> &backtracker){

if(it == param.end()){
result.append(backtracker);
}
for(auto i = it->begin; i!= it->end(); i++){
backtracker.push_back(*i);
getCombinations(param, it+1, backtracker)
backtracker.pop_back();
}
}

list<list<string>> &getResult() { return result; }

private:
list<list<string>> result;
};

Мой опыт показывает, что в 95% случаев кто-то занимается мыльными делами по поводу практики, это личная непристойность. Остальные 5% времени это хороший здравый смысл.

1

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

Насколько я знаю, выходные параметры — это хорошая практика, в зависимости от того, что вы делаете. Вот для чего нужны указатели или ссылки. И именно поэтому Java или C # по умолчанию используют ссылки на объекты. Лучшая производительность, простота в использовании и т. Д.

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

Вы также можете определить копию, правильно переместить конструкторы (то есть вам нужно создать класс-оболочку над списками), как вы сказали ранее.

0