2009-06-25 12 views
11

私は1次元の関数最小化関数を持っています。今は関数ポインタを渡しています。しかし、多くの関数には複数のパラメータがあり、そのうちのいくつかは固定されています。私はこのようなファンクタを使ってこれを実装しましたどのようにboost :: bindオブジェクトを関数に渡しますか?

template <class T> 
minimize(T &f) { 
} 

Functor f(param1, param2); 
minimize<Functor>(f); 

しかし、ファンクタの定義には多くの種類があります。 Boost :: bindはよりきれいに見えます。私が行うことができるように:

minimize(boost:bind(f,_1,param1,param2)) 

は私がクリアしていないよしかし、私のminimize宣言はboost::bindを使用してのように好きすべきか。どのタイプのオブジェクトがboost::bindですか?ファンクタの定型句を避け、複数のパラメータバインドを可能にする簡単なパターンがありますか?

答えて

17

boost::functionを使用できます。 boost::bindは独自の戻り値型を持っていますが、それはboost::functionと互換性があります。

typedef boost::function<bool(std::string)> MyTestFunction; 

、その後、あなたがboost::bindと互換性のある任意の関数を渡すことができます:一般的な使用は、機能のtypedefを作ることです

bool SomeFunction(int i, std::string s) { return true; } 
MyTestFunction f = boost::bind(SomeFunction, 42, _1); 
f("and then call it."); 

私はそれはあなたが望むものであると思います。

また、に第2のパラメータとして呼び出しのためのthisポインタを渡すことによってメソッドと動作します。このような

minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f) 
{ 
    ... 
} 

次に呼び出す最小化することができ():

4

私は最小限に定義します()このよう

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...)); 
3

変更値パラメータへのパラメータ。関数オブジェクトは意図的に軽量であり、boost::bindは確かに、boost::compressed_pairを使用して数バイトのスペース内に収まるように特別に作られています。

template <class T> 
void minimize(T f) { 
} 

次に、boost::bindの結果を渡すことができます。 boost::bindは、実際にはある種のオブジェクトを返す関数テンプレートであることに注意してください。だからminimizeが非const参照パラメータを持つことができませんでした。

1

まず、あなたのテンプレート引数をref-to-constであるとみなしているので、boost :: bindによる一時的なreturendはバインドされません。

template <class T> 
T::result_type minimize(const T &f) { 
} 

をしかし、あなたは同様にあなたのファンクタでこれを使用したい場合、彼らは()constは演算子を持っている必要があります。だから、好きそれを使用することができます。優れているので、おそらく値によって:

template <class T> 
T::result_type minimize(T f) { 
} 

私はのresult_typeを後押しするTを強制します::(かなり複雑型バインドリターンよりも)機能を::リターンはTも持つと信じて、私はありませんよ100%

関連する問題