存储,解析和执行存储的成员函数

时间:2019-05-24 17:04:26

标签: c++

我目前正在处理一些代码,需要做类似事件处理程序的事情,我可以注册显式事件并将它们存储到一个向量中,以便在我的主listen()函数中循环通过。我遗漏了一些无法通过文档和Google搜索精确定位的指针,并且需要帮助弄清楚为什么我的编译器要求指向成员的指针。

我尝试用成员函数定义创建一个typedef,但是我遇到的问题是当前不能使用“非标准语法,使用&来创建指向成员的指针”进行编译。错误。

class Obj {
private:
    typedef int (Obj::*Event) (std::vector<std::string> in);
    std::vector<Event> events;

    int exampleEvent(std::vector<std::string> input);
public:
    Obj();

    int regEvent(Event ev);
    int listen();
}

事件代码示例

int Obj::exampleEvent(std::vector<std::string> input)
{
    // heres my app logic
    return 0;  
}

在构造函数中注册事件

Obj::Obj()
{
    regEvent(exampleEvent); // exampleEvent: non-standard syntax; use 
                            //'&' to create a pointer to member
}

收听,并将事件添加到矢量。

int Obj::regEvent(Event ev)
{
    events.push_back(ev);
    return 0;
}

// listen for command input
int Obj::listen()
{ 
    // get input
    string str;
    getline(cin, str);
    vector<string> input = split(str, " ");

    // loop through events
    for (auto ev : events)
    {
    ev(input); // <-- Term does not evaluate to function taking 1 arg.
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

期望的语法是:

regEvent(&Obj::exampleEvent);

答案 1 :(得分:1)

Obj::Obj()
{
    regEvent(exampleEvent); // exampleEvent: non-standard syntax; use 
                            //'&' to create a pointer to member
}

必须

Obj::Obj()
{
    regEvent(&Obj::exampleEvent); 
}

for (auto ev : events)
{
ev(input); // <-- Term does not evaluate to function taking 1 arg.
}

必须

for (auto ev : events)
{
  (this->*ev)(input);
}