chr*_*ris 1 c++ generics templates callback c++11
我正在尝试在类中存储回调.目前,我这样做:
struct Callback {
Callback (std::function<void ()> func) : func_ (func){}
void call() const { func(); }
private:
std::function<void ()> func_;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,只能使用特定类型的函数(当前无返回且无参数).
有没有什么方法可以使用这样的类,我把它传给它的是什么?
void increment (int &n) {
++n;
}
int main() {
int someNum = 5;
Callback callback (increment, someNum); //will call `increment (someNum);`
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用参数包来存储参数,并使用a typename来存储返回类型,然后制作std::function<ReturnType (Args)> callback_一些东西,并用类似的东西调用它callback_ (givenArgs...);.然而,我对模板的知识不够,或者甚至弄清楚它是否可行.
我将从中获得的实际用途(至少现在)是一个计时器,但也许制作一个generic_function<>包装一个小的类std::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
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这也可以应用于其他概念,但我不知道如何首先获得这种语法.我可以构建两个不同的表单,以防返回类型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);`
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要std :: ref以确保someNum通过引用传递,并且您需要确保someNum在范围内的时间比回调更长.
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |