Помогите расшифровать макрос С++
Вопрос к знатокам теории языка С++.
Есть макрос:
Код:
#define Closure(n) (void (TObject::*)(TObject *))&(n)
Вторую его часть никак не пойму. Я понимаю так, что имеется указатель (с явным указанием принадлежности классу TObject) на функцию, принимающую в качестве единственного аргумента указатель на объект класса TObject и возвращающую void. Но далее не понятно. В качестве n (таково применение макроса) передается адрес функции некоторого другого класса (наследника от TObject). Но почему все это написано слитно??? Что это в итоге получается? Помогите, пожалуйста, понять.
void (TObject::*)(TObject *)
Это попытка преобразовать обработчик события - указатель на метод экземпляра класса - в указатель на метод класса. Делается следующим образом
Код:
// Пример объявления обработчика базового события VCL
typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender);
typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender);
1. n - это "обработчик события" - объект размером 8 байт из двух неименованных полей (адрес метода класса VCL, адрес объекта класса VCL).
2. Выполняем операцию определения адреса (&) для n.
3. Преобразуем адрес обработчика в указатель на функцию - ГЛЮК!!!!!!!
Нужно произвести для полученного указателя операцию обращения по адресу (*). Вот пример эквивалентного кода, который вызывает метод класса, адрес которого извлекается из обработчика события.
Код:
typedef void __fastcall (TObject::*TNotifyMethod) (System::TObject* Sender);
TNotifyEvent evt = this->Button1->OnClick;
void **vptr = (void**) &evt;
// Определение адреса метода
TNotifyMethod meth = *(TNotifyMethod*) vptr;
// Вызов метода по указателю meth для объекта this с параметром this
(this->*meth)(this);
TNotifyEvent evt = this->Button1->OnClick;
void **vptr = (void**) &evt;
// Определение адреса метода
TNotifyMethod meth = *(TNotifyMethod*) vptr;
// Вызов метода по указателю meth для объекта this с параметром this
(this->*meth)(this);