如何将lambda函数传递给具有未知类型和未知参数的构造函数

时间:2017-12-14 18:04:11

标签: c++ c++11 lambda

我正在尝试创建一个构造函数,它将接受具有未知类型和未知参数的lambda函数。我已经设法让它与传递没有参数的函数一起工作,但是当我尝试向函数添加参数时,我无法理解如何匹配参数列表。

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();
}

h file

#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函数,因为我认为使用捕获将是有益的。

1 个答案:

答案 0 :(得分: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