我想要实现的是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进行编译
答案 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();
}