如何创建将另一个函数作为参数且参数数量未知的函数?

时间:2019-02-20 22:46:41

标签: c++ function parameters

我正在创建一个onClick函数。前提是单击按钮时,它将调用如下函数:

// This connects the callback to the button class method named "something"
something.onClick(&callback, "a string", 123);

// This is called when the button is clicked
callback("a string", 123);

我已经在使用函数指针来调用函数callback,但是我不知道如何接受可变数量的参数。我想要的API与我上面指定的完全一样:第一个参数是函数,而每个后续参数都是要传递的参数。到目前为止,我还考虑过使用boost :: bind,但无法弄清楚它与我尝试的方式如何匹配。

2 个答案:

答案 0 :(得分:1)

您可以仅在lambda中捕获提供的参数。无法将其存储在函数指针中,因此请使用std::function

class Something
{
public:
    template <typename Func, typename ... Args
    void onClick(Func&& func, Args&& ... args)
    {
        m_onClick = [=]{ func(args...); };
    }
private:
    std::function<void()> m_onClick;
    // call m_onClick somewhere
};

int main () {
    Something something;
    something.onClick(&callback, "a string", 123);
}

答案 1 :(得分:0)

如果不知道函数有多少个参数,将如何调用该函数?有解决方案,但是为什么不保持简单...

让我们说您想使用两者之一作为回调:

void foo(std::string x) {}
void bar(int x) {}

然后,您可以将它们与参数一起包装在lambda中,并像这样存储在std::function中:

#include <string>
#include <functional>

void foo(std::string x) {}
void bar(int x) {}

struct caller {
    std::function<void()> callback;
    void call() { callback(); }
};

int main(){
    caller c{ [](){ foo("test"); }};
    c.call();
    caller d{ [](){ bar(1); }};
    d.call();
}

如果要传递的参数应该更动态,那么您当然需要更多。