2016-10-26 10 views
1

私はこれに対してC++の答えに大いに興味がありますが、Cの回答も同様に歓迎されるでしょう。これは私の質問に焦点を当てるための実際のコードの簡略化されたバージョンですので、私が書いたものが正しいと仮定してください:P使用しないかもしれないパラメータの値をいつも計算しないようにする

私はprocessという関数をライブラリに持っているとします。
この関数は、関数のみを行うにはBの値を必要とするほとんどの時間、それが仕事ですが、いくつかの状況でを必要とする三つのパラメータ、、B、およびC
を取りますc

今私はこれをメインプログラムから呼び出したいと思います。
process(1, 2, very_expensive_call(55, 67, "Hello"));

Cの値が計算することが非常に高価であることを想像してみてください。それはおそらく必要ではないので、私がしなければ計算したくない。

が必要になるかどうかを私のメインプログラムが知るロジックを繰り返さなければならないのは嫌です。私は図書館に約very_expensive_callを知りたくありません。

効率的でエレガントなまま高価な機能への呼び出しを防ぐためにコードを整理するにはどうすればよいですか?

答えて

2

それ怠惰なコール作り、リクエストに応じて値を計算する関数オブジェクトを渡す:

template<typename Expensive> 
int process(int, int, Expensive&&); 

、その後、あなたが呼びたい:

process(1, 2, []{ return very_expensive_call(55, 67, "Hello"); }); 

をあなたはしたくない場合テンプレートの機能を使用する場合は、タイプ消去にstd::functionを使用してください(必要に応じてより軽い代替方法があります)。

int process(int, int, function<expensive_result()>); 
呼び出しサイトでの変化を伴わない

process(1, 2, []{ return very_expensive_call(55, 67, "Hello"); }); 

このソリューションは、明示的に値を計算するために取得processのコードでオペレータ()を呼び出すことが必要になります。

+1

私はそれについてかなり考えていると思います。 ありがとうございました。 – jcoder

関連する問題