2012-02-25 6 views
0

boost :: bindを使用したいのですが(実際に私の問題の解決策が正しいかどうかはわかりません)、ラッパーは引数を1つしか取らず、もう一方は一定の値に固定します。boost :: bindを使用して関数ラッパーを作成する方法

typedef boost::function<double (double)> callback; 

と私の考えが持つ機能のラッパーを作成することでした。私の機能は私のコードで

double f(double a, double b) 
{ 
    return a/b; 
} 

または

double g(double b) 
{ 
    return 2*b; // b+b? 
} 

のように、私は一つの引数を持つ関数のtypedefを持って見てこれは:

callback cb; 
cb = boost::bind(f, _1, 2)(x); 

は、引数で渡された包み機能使用していることを、私は第三の機能を呼び出すことができるように:

double use(callback cb, double x, double y) 
{ 
    return cb(x0) - y0; 
} 

を私は、1つのまたは2つの引数を持つ約30の機能を持っており、第一又は第二は定数でなければなりません。この定数はuse()には分かりませんが、useに実装されているアルゴリズムはすべての関数で動作します。

私は私のコードをコンパイルしようとすると、私はラインcb = boost::bind(f, _1, 2)(x);のエラーを取得:私はcout << boost::bind(f, _1, 2)(x);で、私はエラーを取得しないよう、直接バインドを使用しようとすると

'* f' cannot be used as a function 

を。

私はここで何が間違っていますか?

答えて

2

なぜ(x)を追加しますか?

cb = boost::bind(f, _1, 2); 

これは、すでに2番目の引数が2であるfのラッパーを定義し、あなたは

cb(x0) 

f(x0, 2)を取得するために呼び出すことができます。

+0

'boost :: bind'ドキュメントのすべての例がそうしているので、私は'(x) 'を追加しました。これを指摘しているように、不足している引数は 'use()'で埋められ、バインドが完了した時点では分からないため、明らかです。それは今働きます、ありがとう! – Christoph

関連する問題