1

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

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);`
}

我正在考虑使用参数包来存储参数,并使用 atypename来存储返回类型,然后做std::function<ReturnType (Args)> callback_一些事情,并用类似callback_ (givenArgs...);. 但是,我对模板的了解还不够,甚至无法确定是否可行。

我会从中得到的真正用途(至少现在是这样)是用于计时器,但也许制作一个generic_function<>包装 an 的小类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与先前无关的问题无关,但是存储具有任意数量和类型的参数的函数会让我感到困惑。如果可能的话,我该如何使用这样的语法?如果不是,语法有多接近?

4

1 回答 1

5

我认为您只想使用 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);`
}

Note that you need the std::ref to ensure that someNum is passed by reference and that you need to make sure that someNum stays in scope longer than the callback.

于 2012-06-07T03:46:47.817 回答