2017-12-14 5 views
-2

未知の型と未知のパラメータを持つラムダ関数をとるコンストラクタを作成しようとしています。私はそれがパラメータを持たない関数を渡すことで動作するようにすることができましたが、関数にパラメータを追加しようとすると、引数リストの一致方法を理解できません。未知の型と未知のパラメータを持つコンストラクタにラムダ関数を渡す方法

のcppファイル

#include "TestBind.h" 

using namespace std; 
int main() 
{ 
    int i = 10; 

    function<int(int, int)> Multiply = [&i](int a, int b) 
    { 
     i = 11; 
     return i * a * b; 
    }; 

    g<int,int,int> n (Multiply); //problem line 
    n.runFunc(); 
    cout << i << endl; 

    cin.clear(); 
    cin.ignore(); 
    cin.get(); 
} 

時間ファイル

#include <functional> 
#include <iostream> 

using namespace std; 

template <typename ReturnType, typename... Args> 
class g 
{ 
public: 
    g(Args... args, function<ReturnType(Args...)> func) { f = func; }; 
    void runFunc() { 
     cout << f() << endl; 
    }; 
    ~g() {}; 

private: 
    function<ReturnType(Args...)> f; 
}; 

私は、これはhereに答えてきたことをかなり確信しているが、私は解決策を実装する方法を理解していません。

私は実際に何をしようとしているのですか?私は後でopenglでボタンを作るために使われるクラスを作ろうとしています。これらのボタンは、未知の戻り値の型と未知の引数(型と量)を持つ関数を持つことができます。私は現在、私はこれらの要件を持つ関数を渡すことができるオブジェクトを作成し、次に(ボタンをクリックした場合のように)関数を実行するテストを行っています。これを済ませたら、すでにopengl側を処理しましたただ概念の証明をしようとしています。私はキャプチャの使用が有益だろうと思ったので、std :: function/lambda関数を使用しています。

+0

ヒント:おそらく、あなたはこのような何かを探している関数呼び出しに渡されたパラメータである参照してください – Zereges

+0

[ 'のstd :: reference_wrapper'](HTTP(ノートが、そうではありません) ://en.cppreference.com/w/cpp/utility/functional/reference_wrapper)これを行います。それをインスピレーションとして使うことができます。 –

+0

@DavidG他の2(C++とlambda)を追加するときは、誤ってそれを推奨セクションでクリックしたはずです –

答えて

0

あなたがしようとしていることが明確ではありません。

class g 
{ 
public: 
    template <typename F, typename... Args> 
    g(F&& func, Args&&... args) { 
     f = [=]() { std::cout << func(args...) << std::endl; }; 
    } 
    void runFunc() { 
     f(); 
    }; 

private: 
    std::function<void()> f; 
}; 

Demo

関連する問題