gpt4 book ai didi

c++ - 通用回调

转载 作者:行者123 更新时间:2023-11-30 01:26:14 24 4
gpt4 key购买 nike

我正在尝试在类中存储回调。目前,我做这样的事情:

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...); 的东西来调用它.然而,我对模板的了解还不够多,无法做到这一点,甚至无法弄清楚是否可行。

我从中得到的真正用途(至少现在)是一个计时器,但也许是一个小的 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
}
}

当然这也可以应用于其他概念,但我不确定首先如何着手获得这种语法。如果返回类型为 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 在范围内的停留时间长于回调。

关于c++ - 通用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10925304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com