如何创建一个将另一个函数作为参数的函数,该函数具有未知数的参数

How can I create a function that takes another function as a parameter with an unknown number of arguments?

本文关键字:函数 参数 未知数 另一个 创建 何创建 一个      更新时间:2023-10-16

我正在创建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,但是无法弄清楚这将如何适合我的尝试。

您可以在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);
}

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

假设您想将两者中的任何一个用作回调:

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

如果要传递的参数应该更具动态性,您当然需要更多的东西。