0

Present は関数をコールバックとして登録するためのクラスです。

class Action {
private:
    static std::multimap<std::string, std::function<void()>> actions;
public:
    static void registerAction(const std::string &key, std::function<void()> action);
}

明らかに、メンバー関数への関数ポインター オブジェクトはクラスを指定する必要があるため、メンバー関数を登録することはできませんが、すべてのクラスはその関数を登録できる必要があります。std::function<void(Class&)>

テンプレート システムを使用すると、静的クラスの 1 つの「インスタンス」からすべてのアクションにアクセスできませんでした。これはどのように実現できますか?

例:

class B {
public:
    B() {
        Action::registerAction("some_action", &callMe);
    }

    void callMe(){}
}
4

2 に答える 2

3

std::bind またはラムダ関数を使用できます

// std::bind
Action::registerAction( "bla", std::bind(&callMe, this) );

// lambda
Action::registerAction( "bla", [this]() { this->callMe(); } );

ラムダ関数を読むことをお勧めします。非常に使いやすく、std::bind よりもはるかに強力です。

于 2013-08-21T00:14:09.377 に答える