out パラメーターよりも戻り値を使用する方が望ましいという多くの引数を見てきました。それらを回避する理由については確信がありますが、回避できないケースに遭遇しているかどうかはわかりません。
私の質問のパート 1は次のとおりです。out パラメータを使用して回避するためのお気に入りの/一般的な方法は何ですか? 線に沿ったもの:男、ピアレビューで、他のプログラマーがこの方法で簡単にできるときにこれを行うのをいつも見ています。
私の質問のパート 2では、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);
しかし、これが可能かどうかはわかりません。
2 番目の例: オブジェクトの配列があります。配列内のオブジェクトは複合型であり、各要素に対して作業を行う必要があり、各要素にアクセスするメイン ループから分離しておきたい作業です。コードは現在次のようになっています。
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 に遭遇しましたが、それについてもっと読む必要があり、コンパイラ固有の機能のように思えます。