2012-02-15 11 views
1

C++の関数に関する2つの質問があります。参照として渡すときに関数を動的に宣言でき、後で使用する関数を格納することは可能ですか?C++:動的関数とストア関数を渡しますか?

動的機能に合格する?

私の質問は完全に透明文言が、何私が意味することは、かなり頻繁にのようなコードを参照するJavaであることはできません。

button.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println("..."); 
    } 
}); 

またはJavaScript:Cにおけるながら

$(".class").each(function() 
{ 
    alert("..."); 
}); 

を++あなたは以下に限定されています:

void print() 
{ 
    std::cout << "..." << std::endl; 
} 

void func(void (&f)()) 
{ 
    f(); 
} 

// ... 

func(print); 

void func(void (&f)()) 
{ 
    f(); 
} 

// ... 

func(void f(){ ... }); 

これはC++の単なる制限ですか?

関数を格納していますか?

似たような機能を後で呼び出すコンテナに格納することは可能ですか?アイデアの一例(動作しない)である:イベントシステム上で作業しているとき

std::vector< void() > storage; 

void callMeLater(void (&f)()) 
{ 
    storage.push_back(f); 
} 

void popFunction() 
{ 
    void f() = storage.pop_back(); 
    f(); 
} 

これらのアイデアは、両方の私のTimerオブジェクトも遅延機能だけでなく、イベントのコールを処理できるかどうかを確認するために、私のところに来ました。 C++コードでこれを使用したことは一度も見たことがないので、可能だとは思っていませんが、そうでなければ表示されるのが大好きです!

ありがとうございます。現在の標準で

答えて

2

、それは非常に簡単になっています:

#include <functional> 

void foo (std::function<float(float,float)> bar) { 
    std::cout << bar (0.5, 0.75); 

    std::function<float(float,float)> frob = bar; 
} 

角括弧内で使用すると、出力(この場合は、単一のフロート)と入力(2つのfloat)を宣言。

あなたは、このようにそれを呼び出すことができます:あなたはまた、このようなfooを置き換えることができ

float perlin_noise_function (float x, float z) { ... } 

class PerlinNoiseFunctor : public std::binary_function<float(float,float)> 
{...}; 

int main() { 
    // pass function pointer 
    foo (perlin_noise); 

    // pass functor 
    PerlinNoiseFunctor pnf; 
    foo (pnf); 

    // pass lambda function 
    foo ([] (float x, float z) { ... }); 
} 

template <typename F> 
void foo (F f) ; 
+0

ああ、すごいです。それはまさに私が探していたものです。有難うございます。 – ssell

関連する問題