2017-12-23 22 views
1

私の初期化されたファンクションオブジェクトをいくつかの方法で自分の関数に渡したいと思います。ファンクションオブジェクトを関数の引数として渡す

「for_each」というだけの機能を持つ例は見つかりませんでしたが、私が理解する限り同じように動作するはずです。

void f(int& n, void (*g)(int& m)){ g(n);}; 

class TEST{ 
public: 
    int init=0; 
    TEST(int _init):init(_init){} 
    void operator() (int& m) {m+=init;} 

}; 

int main(int argc, char *argv[]) 
{ 
    int k, m; 
    cin >> k >> m; 

    TEST mytest(m); // OK, creates object with initialization 
    mytest(m);   // OK, using initialized object's "operator()" 

    f(k,mytest);  // error: cannot convert 'TEST' to 
         // 'void (*)(int&)' for argument '2'to 
         // 'void f(int&, void (*)(int&))' 

    f(k,TEST(m));  // error: cannot convert 'TEST' to 
         // 'void (*)(int&)' for argument '2'to 
         // 'void f(int&, void (*)(int&))' 

    return 0; 
} 
+1

'テンプレート空隙F(INT&N、FのG){G(N);};' –

+0

...関数オブジェクトは広い用語であり、そして一般的に*関数に変換できないためポインタ*。 – StoryTeller

+0

mytestはintではありません。mytestを試してみましたか? –

答えて

4

タイプvoid (*)(int& m)の関数ポインタとTESTのインスタンス間で共通何ですか?

これらは、タイプint&の引数で呼び出すことができます。

違いは何ですか?

これらは2種類あります。関数テンプレートを使用していない限り、それらは同じ意味で使用することはできません。

したがって、解決策は関数テンプレートを使用することです。

template <typename Callable> 
void f(int& n, Callable c) 
{ 
    c(n); 
} 
関連する問題