将功能名称传递给事件总线系统中的事件类

时间:2019-06-23 14:59:59

标签: c++

我正在编写一个简单的事件总线系统以熟悉此模型。我有一个addEvent函数,它带有事件名称(字符串)和一个函数。我在建立活动课程时遇到问题。

// Event class to define our event
class Event
{
public:
    // function is some function that needs to be executed later
    Event(const string eventName, void * function)
    {
        msgEvent.first = event;
        msgEvent.second = function;
    }

    string getEvent(){
        return msgEvent;
    }
private:
    pair<string, void*> msgEvent;
};

因此,当我调用addEvent(“ open”,openFunction)时,我想将此信息存储为Event的一部分。

我很难理解如何存储函数,以及是否在构造函数中正确地将函数作为参数传递。

1 个答案:

答案 0 :(得分:1)

您可以使用函数指针或std::functionvoid*肯定是不正确的。无论如何,您都需要知道函数具有的签名。假设您的函数不接受任何输入,也不返回。然后,他们的签名是void()

然后,您可以使用以下代码:

#include<functional>
#include<string>
class Event
{
public:
    // function is some function that needs to be executed later
    Event(const std::string eventName, std::function<void()> functionName)
    {
        msgEvent.first = eventName;
        msgEvent.second = functionName;
    }

    std::string getEvent(){
        return msgEvent.first;
    }

    void execute() {
        msgEvent.second();
    }

private:
    std::pair< std::string, std::function<void()> > msgEvent; // why are you using
                                                              // std::pair here?
};

现在,您可以写

Event myEvent( "open", [](){ /* do something */ } );
myEvent.execute();