2012-04-25 9 views
2

可能性の重複:
How do function pointers work?関数をパラメータとしてどのように渡しますか?

どのようにパラメータとして関数を渡すのですか?

また、別のクラスの関数をパラメータとして渡すことはできますか?

+0

ルックアップコールバック。 –

+0

他のものをパラメータとして渡すのと同じ方法です。あなたはそれを渡したい関数の名前の後に括弧の中にその名前を入れます。どちらの部分に問題がありますか?うーん - タイトルは本当にそれをすべて言っていないでしょうか? –

答えて

0

関数ポインタを渡す必要があります。構文はそれほど難しくありません。また、cとC++で関数ポインタを使用する方法の完全な内訳を提供する素晴らしいページhereがあります。

そのページ(http://www.newty.de/fpt/fpt.html)から:

//------------------------------------------------------------------------------------ 
// 2.6 How to Pass a Function Pointer 

// <pt2Func> is a pointer to a function which returns an int and takes a float and two char 
void PassPtr(int (*pt2Func)(float, char, char)) 
{ 
    int result = (*pt2Func)(12, 'a', 'b');  // call using function pointer 
    cout << result << endl; 
} 

// execute example code - 'DoIt' is a suitable function like defined above in 2.1-4 
void Pass_A_Function_Pointer() 
{ 
    cout << endl << "Executing 'Pass_A_Function_Pointer'" << endl; 
    PassPtr(&DoIt); 
} 
+0

ありがとう、私は家に帰るときにこれを試してみます – user1338743

2

二つの方法があります。

1つは関数ポインタ@dusktreaderのアウトラインです。

functors、または関数のパラメータでoperator()をオーバーロードし、クラスのインスタンスを渡すクラスを定義する関数オブジェクトを使用します。

私は常に後者がより直感的であることを発見しましたが、どちらかを実行します。

+0

Functorsはテンプレート関数に渡されたときにのみ動作します。 –

+0

@MarkRansom関数オブジェクトは、 'virtual'を介して共通ベースと動的ディスパッチを使用することもできます。 – justin

+1

@MarkRansomは 'std :: functions'ではありません。 – juanchopanza

3

関数ポインタ以外にも、std::function and std::bind(またはC++ 11がない場合はboost相当)を使用できます。そして、あなたは、たとえば、それをその署名と一致したものを渡すことができ

double foo(std::function<double(int, int)> f) { 
    return 100*f(5,89); 
} 

:あなたは2つのintを取り、doubleを返すstd::functionをとる、この関数を定義するようなものを行うことができますので、これらは、polimorphic関数ラッパーを提供します。

struct Adder { 
    double bar(double a, double b) { return a+b;} 
}; 

int main() { 
    using namespace std::placeholders; 
    Adder addObj; 
    auto fun = std::bind(&AdderC::bar, &addObj, _1, _2); // auto is std::function<double(int,int)> 

    std::cout << foo(fun) << "\n"; // gets 100*addObj.bar(5,89) 
} 

これらは両方とも強力で使いやすく、役に立たない例で誤解されることはありません。プレーン関数、静的関数、メンバ関数、静的メンバ関数、ファンクタをラップすることができます。

関連する問題