泛型回调

Generic Callback

本文关键字:回调 泛型      更新时间:2023-10-16

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

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 在作用域中停留的时间比回调长。