多态回调实现

时间:2015-12-30 22:39:23

标签: c++ delegates polymorphism

我在我的应用程序中使用基于组件的体系结构。我正处于需要允许Component指定将在事件中执行的回调的阶段。

typedef void(Component::*EventCallback) ();
typedef std::pair<Component*, EventCallback> EventDelegate;

上述类型定义的问题是所有组件都继承自Component但永远不会是直接Component。因此以下代码行无效:

MoveComponent* mc = new MoveComponent(); // inherits from Component
EventDelegate ed(mc , &MoveComponent::moveToXY); // Compiler error here: expects Component* not MoveComponent*, and same for EventCallback.

我有什么想法可以实现'多态'回调?或任何其他设计/实施建议?

使用示例:

typedef void(Component::*EventCallback) ();
typedef std::pair<Component*, EventCallback> EventDelegate;

class Component {
    // ...
};

class MoveComponent : public Component {
public:
    MoveComponent() {

        EventDelegate ed(this, &MoveComponent::moveToXY);
        ComponentManager::registerEvent(ed);
    }

    void moveToXY() { }
};

class ComponentManager {
public:

    static void registerEvent(EventDelegate ed) {
        evtRegistry.push_back(ed);
    }

    static void runEvent(EventDelegate ed) {
        for (int i=0; i<evtRegistry.size(); i++) {
            Component* context = evtRegistry.at(i).first;
            EventCallback ec = evtRegistry.at(i).second;
            context->*ec();
        }
    }

private:
    static std::vector <EventDelegate> evtRegistry;
};

1 个答案:

答案 0 :(得分:6)

using EventDeligate = std::function<void()>;

auto cp = std::make_shared<MoveComponent>();
auto ed = EventDeligate([cp](){ cp.moveToXY(); });

按照您的方式执行,Component必须具有(可能是纯粹的)虚拟函数moveToXY