泛型回调
Generic Callback
>我正在尝试在类中存储回调。 目前,我做这样的事情:
struct Callback {
Callback (std::function<void ()> func) : func_ (func){}
void call() const { func(); }
private:
std::function<void ()> func_;
};
如您所见,只能使用特定类型的函数(当前没有返回和参数)。
有什么方法可以使用这样的类,我在哪里传递它来调用它?
void increment (int &n) {
++n;
}
int main() {
int someNum = 5;
Callback callback (increment, someNum); //will call `increment (someNum);`
}
我想使用参数包来存储参数,使用typename
来存储返回类型,然后制作一个std::function<ReturnType (Args)> callback_
之类的东西,并使用类似 callback_ (givenArgs...);
的东西调用它。但是,我对模板的了解还不够多,无法做到这一点,甚至不知道这是否可能。
我从中得到的真正用途(至少现在)是一个计时器,但也许做一个包装std::function<>
的小generic_function<>
类会更有帮助。但是,对于此示例,每 2 秒暂停和取消暂停一次的计时器:
void togglePause (Countdown &c) {
c.togglePause();
}
int main() {
Countdown main (10000); //create countdown of 10s
Countdown delay (2000, togglePause, main); //this one calls func when expired
for (; !main.expired();) { //go while unpaused time < 10s
delay.wait().reset(); //wait 2s, call callback, reset back to 2s
}
}
当然,这也可以应用于其他概念,但我不确定如何首先获得这种语法。我可以构建两种不同的形式,以防返回类型与不相关的上一个问题void
很好,但是存储具有任意数量和类型的参数的函数会让我感到困惑。如果可能,我如何使用这样的语法?如果不是,语法会有多接近?
我认为您只想使用 std::bind 将带有参数的函数转换为不带参数的函数:
int main() {
int someNum = 5;
std::function<void (void)> boundFunc = std::bind(increment, std::ref(someNum));
Callback callback (boundFunc); //will call `increment (someNum);`
}
请注意,您需要 std::ref 来确保通过引用传递 someNum,并且您需要确保 someNum 在作用域中停留的时间比回调长。
相关文章:
- 架构决策:返回std::future还是提供回调
- 错误处理.将系统错误代码映射到泛型
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如何编写将要继承的泛型代码?
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 以特征类型作为参数的泛型函数回调
- C++使用泛型/模板调整数组大小
- 泛型回调