11

1次元関数の最小化機能があります。今、私はそれに関数ポインタを渡しています。ただし、多くの関数には複数のパラメーターがあり、そのうちのいくつかは固定されています。私はそのようなファンクターを使用してこれを実装しました

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ですか?ファンクターの定型文を回避しながら、複数のパラメーターのバインドを可能にする、このための簡単なパターンはありますか?

4

4 に答える 4

17

あなたはただ使うことができますboost::functionboost::bind独自の戻り値の型があると思いますが、それは と互換性がありboost::functionます。典型的な使用法は、関数の typedef を作成することです。

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

boost::bind次に、互換性のある関数を次のように渡すことができます。

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

それがあなたの望むものであることを願っています。

thisまた、呼び出しのポインタを の 2 番目のパラメータとして渡すことにより、メソッドでも動作しますboost::bind

于 2009-06-25T15:54:15.873 に答える
4

私なら、minimize() を次のように定義します。

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

次に、minimize() を次のように呼び出すことができます。

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));
于 2009-06-25T15:55:13.970 に答える
3

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

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

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

于 2009-06-25T15:56:56.717 に答える
1

まず、テンプレート引数を ref-to-non-const として使用しているため、boost::bind による一時的な戻り値はそれにバインドされません。したがって、次のように使用できます。

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

ただし、これをファンクターでも使用する場合は、const operator() が必要です。したがって、おそらく値の方が優れています。

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

戻り値を T::result_type にすると、T が (複雑な型バインドの戻り値ではなく) 強制的に boost::function になると思いますが、100% ではありません。

于 2009-06-25T15:57:32.270 に答える