Define INVOKE (f, t1, t2, ..., tN) as follows:
- (t1.*f)(t2, ..., tN)when f is a pointer to a member function of the class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of type derived from T;
- ((*t1).*f)(t2, ..., tN)when f is a pointer to a member function of the class T and t1 is not one of the types described in the previous paragraph;
- t1.*fwhen N == 1 and f is a pointer to the data of an element of class T, and t1 is an object of type T or a reference to an object of type T or a reference to an object of type obtained from T;
- (*t1).*fwhen N == 1 and f is a pointer to the data of an element of class T and t1 is not one of the types described in the previous paragraph;
- f(t1, t2, ..., tN)in all other cases.