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私はエラーが発生します

「type 'std::list >::iterator' (別名 '__list_iterator') は呼び出し演算子を提供しません」

Xcodeでコンパイルしています

4

2 に答える 2

4

イテレータが参照する要素を取得するには、イテレータを逆参照する必要があります。イテレータ自体にはありませんoperator()

書く(*f)(state);か、必要に応じて、f->operator()(state);

于 2013-11-01T20:26:56.223 に答える
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();
}
于 2013-11-01T20:26:38.057 に答える