2011-07-08 16 views
3

私はこのコードを実行しようとします。私はほとんど存在していますが、私はラインで捕まってしまった:すべてのメンバー関数を渡して、フリー関数のブーストポインタを作成します。

_f = std::bind1st(
     std::mem_fun(f, x); 

まず、私は任意のコードを変更する必要はありませんことをご理解くださいますが、コンストラクタ。どうして?私は学びたいから。最終的に私はラッパクラスFuncを書いて、自由な関数とメンバ関数をこのように同時に扱いたいと思っています。

だから、std::mem_func() -call内の最初の引数として何を入れなければならないのですか? 私は数多くのことを試しました。

おそらくこれは重複していますが、この問題の検索方法はわかりません。私は語彙が足りない。誰かがチュートリアルや何かを指し示すことができれば、この問題を表現するのに役立ちます。事前に

#include <boost/function.hpp> 
#include <iostream> 

struct X 
{ 
    int foo(int i) 
    { 
     return i; 
    }; 
}; 

class Func 
{ 

public: 

    Func(X *x, int (X::* f) (int)) 
    { 
     _f = std::bind1st(
     std::mem_fun(f, x); 

     std::cout << _f(5); // Call x.foo(5) 
    }; 

private: 

    boost::function<int (int)> _f; 
}; 

int main() 
{ 

    X x; 

    Func func(&x, &X::foo); 
    return 0; 
} 

ありがとう:

はここで完全なサンプルコードです。

+0

あなたが学んでいるなら、 'boost :: bind'を見てください。物事をクリックします... – Nim

+0

この例は、boost関数のドキュメントから来ています。そこでは、彼らはブーストを利用しない:この文脈でのバインド。私が問題を抱えていた行を(単純な)boost:bind() - 呼び出しに変更できれば、それについて知ってうれしいです。 – AudioDroid

答えて

4

あなただけの括弧忘れてしまったようだ。(それは、この場合には重要ではありませんが、このスタイルは、長期的にはより安全である私は

Func(X *x, int (X::* f) (int)) 
    : _f(std::bind1st(std::mem_fun(f), x)) 
{ 
    std::cout << _f(5); // Call x.foo(5) 
}; 

で初期化するであろうが

_f = std::bind1st(std::mem_fun(f), x); 

を。)

+0

ありがとう、それです。どうして私はその権利を得ることができなかったかもしれない...多分私は休憩を取る必要があります。 ;-)私はあなたの答えを3分で正確にマークすることができます。私は確信しています。 – AudioDroid

+0

@AudioDroid:あなたを責めることはできません。 GCCの最初のエラーは '' mem_fun(int(X :: *&)(int)、X *&) ''の呼び出しのための関数がないことです。 –

+0

この例を2つのintを引数とする関数(sum()など)に拡張しました。要するに、これ以上は機能しません。 :-(私はもうちょっと時間をかけて別の質問を開いてみよう。 – AudioDroid

1

インターフェイスでboost::functionを使用するようにクラスを少しリファクタリングしてから、最も一般的な方法でバインドする方法をユーザーが決定できます。

struct X { 
    int foo(int i) { return i; }; 
}; 
class Func { 
    boost::function<int (int)> _f; 
public: 
    Func(boost::function<int (int)> f){ 
     _f = f; 
     std::cout << _f(5); 
    }; 
}; 
int foo(int x) { return 2*x; } 
int bar(int x, int multiplier) { return x*multiplier; } 
int main() { 
    X x; 
    Func func1(boost::bind(&X::foo, &x, _1)); // this does the magic 
    Func func2(boost::bind(&foo, _1));  // you can also bind free functions... 
    Func func3(boost::bind(&bar, _1, 5));  // or with different arguments 
} 
+0

それは良いアイデアだが、私はすべての "boost stuff"を隠しておきたいと思っている。 – AudioDroid

関連する問題