如何创建一个将另一个函数作为参数的函数,该函数具有未知数的参数
How can I create a function that takes another function as a parameter with an unknown number of arguments?
我正在创建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();
}
如果要传递的参数应该更具动态性,您当然需要更多的东西。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数