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&)>

使用模板系统,我无法从我想的静态类的一个“实例”访问所有操作。这怎么可能实现?

示例它的外观:

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

    void callMe(){}
}
4

2 回答 2

4

鉴于成员函数采用了附加参数,您需要绑定此参数。例如,您可以使用如下内容:

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

bind()表达式将创建一个不带参数的函数对象。显然,要使这种方法发挥作用,this需要坚持足够长的时间。

于 2013-08-21T00:01:04.937 回答
3

您可以使用 std::bind 或 lambda 函数

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

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

我建议阅读 lambda 函数。非常易于使用,并且比 std::bind 强大得多。

于 2013-08-21T00:14:09.377 回答