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

问题描述 投票:-2回答:2

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

c++ function parameters
2个回答
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);
}

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

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

© www.soinside.com 2019 - 2024. All rights reserved.