他の計算に必要な「スクラッチパッド」である C++ データ構造があります。寿命が短く、頻繁に使用されるわけではないため、パフォーマンスは重要ではありません。ただし、他の更新可能な追跡フィールドの中に乱数ジェネレーターが含まれており、ジェネレーターの実際の値は重要ではありませんが、コピーして再利用するのではなく、値を更新する ことが重要です。これは、一般に、このクラスのオブジェクトは参照によって渡されることを意味します。
インスタンスが 1 回だけ必要な場合、最も自然な方法は、必要に応じてインスタンスを作成し (おそらくファクトリ メソッドまたはコンストラクターを使用)、スクラッチパッドを消費するメソッドに渡すことです。コンシューマーのメソッド シグネチャは、これが唯一の用途であることを知らないため、参照渡しを使用しますが、ファクトリ メソッドとコンストラクターは値渡しで返されます。また、名前のない一時オブジェクトを参照渡しすることはできません。
厄介な一時変数でコードが詰まらないようにする方法はありますか? 次のようなことは避けたいです。
scratchpad_t<typeX<typeY,potentially::messy>, typename T> useless_temp = factory(rng_parm);
xyz.initialize_computation(useless_temp);
スクラッチパッドを本質的に作成し、mutable
すべてのパラメーターにラベルを付けるだけで済みますconst &
が、誤解を招く可能性があるため、ベストプラクティスとは言えません。完全に制御できないクラスに対してはこれを行うことはできません。右辺値参照で渡すには、スクラッチパッドのすべてのコンシューマーにオーバーロードを追加する必要があります。これは、明確で簡潔なコードを持つという目的に反します。
パフォーマンスは重要ではないという事実 (ただし、コード サイズと可読性は重要) を考えると、そのようなスクラッチパッドを渡すためのベスト プラクティスのアプローチは何ですか? 必要に応じて C++0x の機能を使用しても問題ありませんが、できれば C++03 のみの機能で十分です。
編集: 明確にするために、一時的なものを使用することは可能です。それは、私が避けたいコードの残念な混乱です。一時的に名前を付けない場合、それは明らかに 1 回しか使用されず、読み取るコードの行数が少ないほど優れています。また、コンストラクターの初期化子では、一時変数を宣言することはできません。