我正在创建一个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,但无法弄清楚它与我尝试的方式如何匹配。
答案 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();
}
如果要传递的参数应该更动态,那么您当然需要更多。