std :: list包含std :: function

时间:2013-11-01 20:24:38

标签: c++ c++11 std-function stdlist

我想要实现的是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我收到错误

  

“type'std :: list&gt; :: iterator'(又名'__list_iterator')不提供调用操作符”

我正在使用Xcode进行编译

2 个答案:

答案 0 :(得分:4)

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

撰写(*f)(state);,或者,如果您愿意,请f->operator()(state);

答案 1 :(得分:2)

在使用*调用之前,必须从迭代器中获取函数元素。把它想象成一个指向所需值的“指针”(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();
}