Я вспомнил Приоритет оператора C ++ с cppreference.com:
operator->
имеет приоритет 2 (выше) operator->*
имеет приоритет 4 (ниже).
и оба слева направо (хотя, ИМХО, здесь это не играет роли).
Это значит,в
(iter->handle->*(iter)->functionClass)
operator->
решается первым, operator->*
впоследствии.
Т.е. указанное выше выражение эквивалентно
((iter->handle)->*((iter)->functionClass))
Обратите внимание, что идентификатор iter
немного вводит в заблуждение.iter
не является итератором (а iterator
имеет совершенно другое значение для контейнеров и массивов).Вместо этого auto&
в for (auto&
... предоставляет ссылку на текущий элемент (для каждого элемента в контейнере после :
).(Может быть, я немного ломаю голову - извините.)
Меня немного беспокоило двойное вхождение iter
в выражении в квесте.Поэтому я попытался завершить пример кода OP, чтобы сделать его MCVE :
// The following things have been added to make this an MVCE
#include <string>
#include <vector>
using namespace std;
struct CrChkTime {
CrChkTime(int) { }
CrChkTime& operator=(int) { return *this; }
CrChkTime& operator+=(const CrChkTime&) { return *this; }
};
// sample code of OP:
class EventListener
{
public:
const char* getName() { return name; }
EventListener();
EventListener(const string& n);
void addTime(CrChkTime t) { time += t; }
void resetTime() { time = 0; }
CrChkTime getTime() { return time; }
private:
virtual void dummy() {}
const char* name;
CrChkTime time;
};
typedef void (EventListener::*ftOnEventClass)(int kind, int param1, void* param2, bool& ret);
typedef struct _eventNode
{
/** For c handlers */
// Excluded: ftOnEvent function;
/** For c++ handlers */
ftOnEventClass functionClass;
/** Handle */
EventListener* handle;
/*...constructors...*/
} EventNode;
int main()
{
vector<vector<EventNode *>> m_vEventHandlerList;
int kind = 0, param1 = 0; void *param2 = nullptr; bool ret; // Missing.
for(auto& iter : m_vEventHandlerList[kind])
{
if(iter->handle != nullptr)
{
(iter->handle->*(iter)->functionClass)(kind, param1, param2, ret);
}
}
return 0;
}
Хотя я до сих пор не понимаю его в деталях (я был слишком нетерпелив, чтобыпоиграть) - так выглядит компилятор.Компилируется без жалоб:
Live демо на coliru