2017-03-03 25 views
-1

我想调用一个指向成员函数的指针,我从地图中检索它。电话th.fpObjHandler(md, evd, tokenIdx)似乎是错误的,我尝试了各种不同的语法(例如.*->*),但我似乎无法做到正确。希望这里有人能够提供帮助。如何调用指向从地图中检索的成员函数的指针?

struct TokenHandler 
{ 
    int tokenIdx; 
    eventDataStatus_t (Schema::*fpObjHandler)(MessageData &md, EventDataImpl &evd, int &tokenIdx); 
}; 

Schema::event(MessageData &md, EventDataImpl &evd) 
{ 
    int tokenIdx = 0; 
    std::map<std::string, TokenHandler> tokenHandlerMap; 
    tokenHandlerMap["timeInterval"] = { -1, &Schema::timeInterval }; 

    // .. 
    // .... 

    TokenHandler th = tokenHandlerMap.at(key); 
    if (th.fpObjHandler != NULL) { 
     th.fpObjHandler(md, evd, tokenIdx); // THIS RESULTS IN ERROR 
     //.. 
     //... 
    } 
} 

eventDataStatus_t Schema::timeInterval(MessageData &md, EventDataImpl &evd, int &tokenIdx) 
{ 
    //.. 
    //... 
    return OK; 
} 

Schema.cpp:111:54: error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘th.TokenHandler::fpObjHandler (...)’, e.g. ‘(... ->* th.TokenHandler::fpObjHandler) (...)’ th.fpObjHandler(md, evd, tokenIdx); ^

+0

@ZeroUltimax,如果我会写'(th。* fpObjHandler)(md,evd,tokenIdx) ',比这会导致错误'fpObjHandler没有在此范围内声明',因此我认为这个问题不同而不是重复。 – Gio

回答

2

首先,你需要的类Schema的一个实例,然后使用.*->*,是这样的:

Schema schema; 

(schema.*th.fpObjHandler)(md, evd, tokenIdx); 

或者,因为你已经在Schema方法:

(this->*th.fpObjHandler)(md, evd, tokenIdx); 
+0

'event'是'Schema'的成员函数,所以'(* th.fpObjHandler)(md,evd,tokenIdx)'应该足够我想。 – Rakete1111

+0

@Thx。现在它确实编译。这看起来效率很低,因为现在每次调用都需要创建一个Schema实例。 – Gio

+1

@ Rakete1111:成员函数指针需要调用一个实例。 – Jarod42