我正在编写一个简单的事件总线系统以熟悉此模型。我有一个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的一部分。
我很难理解如何存储函数,以及是否在构造函数中正确地将函数作为参数传递。
答案 0 :(得分:1)
您可以使用函数指针或std::function
。 void*
肯定是不正确的。无论如何,您都需要知道函数具有的签名。假设您的函数不接受任何输入,也不返回。然后,他们的签名是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();