2

我想要实现的是std::list包含std::functions. 我正在尝试实现一个回调系统,其中可以将函数添加到列表中,然后可以循环遍历列表并调用每个函数。

我在 A 课上的内容是:

std::list<std::function<void( bool )>> m_callbacks_forward;

bool registerForward( std::function<void(bool)> f ) { m_callbacks_forward.push_back ( f ); return true; };

void GameControllerHub::invokeForward( bool state ) {

    for( std::list<std::function<void(bool)>>::iterator f = m_callbacks_forward.begin(); f != m_callbacks_forward.end(); ++f ){

        f();
    }

}

然后在B级

std::function<void(bool)> f_move_forward = [=](bool state) {
        this->moveForward(state);
    };

    getGameController()->registerForward ( f_move_forward );

...

bool Player::moveForward( bool state ) {
...
}

但在GameControllerHub::invokeForward我得到错误

“类型 'std::list >::iterator'(又名 '__list_iterator')不提供呼叫运算符”

我正在用 Xcode 编译

4

2 回答 2

4

您需要取消引用迭代器以获取它所引用的元素。迭代器本身没有operator().

(*f)(state);,或​​者,如果你愿意,f->operator()(state);

于 2013-11-01T20:26:56.223 回答
2

在调用 with 之前,您必须从迭代器中获取函数元素*。把它想象成一种指向所需值(std::function对象)的“指针”,你必须“取消引用”它:

for( std::list<std::function<void(bool)>>::iterator f = m_callbacks_forward.begin(); f != m_callbacks_forward.end(); ++f ){
    (*f)();
}

顺便说一句,如果您可以使用 C++11,那么请利用 for-each 循环:

for (std::function<void(bool)> f: m_callbacks_forward) {
    f();
}

甚至更简洁auto

for (auto f: m_callbacks_forward) {
    f();
}
于 2013-11-01T20:26:38.057 回答