Быстрые делегаты C++ - Правильность const
ОГЛАВЛЕНИЕ
Страница 9 из 12
Правильность const
CBase1 b1;
CBase1 const cb1;
// --------------------------------------------------
// связывание аргументов
MyDelegate dg1(&CBase1::foo, &b1);
MyDelegate dg2(&CBase1::foo, &cb1);
MyDelegate dg3(&CBase1::bar, &b1);
// ошибка компиляции! постоянная функция-член
// не может быть вызвана для непостоянного объекта
// MyDelegate dg4(&CBase1::bar, &cb1);
dg1(123);
dg2(234);
dg3(345);
// --------------------------------------------------
// адаптер функции-члена
fd::delegate2<INT, int *, CBase1> dg4(&CBase1::foo);
fd::delegate2<INT, int *, CBase1> dg5(&CBase1::bar);
fd::delegate2<INT, int *, CBase1 const> dg6(&CBase1::foo);
// ошибка компиляции! непостоянная функция-член
// не может использоваться для постоянного адаптера функции-члена
// fd::delegate2<INT, int *, CBase1 const> dg7(&CBase1::bar);
dg4(&b1, 456);
// ошибка компиляции! постоянный объект не может использоваться для
// непостоянного адаптера функции-члена
// dg4(&cb1, 456);
dg5(&b1, 567);
// ошибка компиляции! постоянный объект не может использоваться для
// непостоянного адаптера функции-члена
// dg5(&cb1, 567);
dg6(&b1, 678);
dg6(&cb1, 678);
Зависящее от платформы соглашение о вызове
Соглашение о вызове не является стандартной возможностью C++, но его нельзя игнорировать, так как оно используется в Win32 API и COM API. С точки зрения реализации оно заключается в скучном повторении одного и того же кода. По умолчанию, ни одно из зависящих от платформы соглашений о вызове не действует. Чтобы включить его, нужно указать соответствующее макроопределение перед включением "delegate.h".
- FD_MEM_FN_ENABLE_STDCALL – чтобы включить поддержку __stdcall для функции-члена
- FD_MEM_FN_ENABLE_FASTCALL - чтобы включить поддержку __fastcall для функции-члена
- FD_MEM_FN_ENABLE_CDECL - чтобы включить поддержку __cdecl для функции-члена
- FD_FN_ENABLE_STDCALL - чтобы включить поддержку __stdcall для свободной функции
- FD_FN_ENABLE_FASTCALL - чтобы включить поддержку __fastcall для свободной функции
- FD_FN_ENABLE_PASCAL – чтобы включить поддержку Pascal для свободной функции
- (Замечание) Поддержка соглашений о вызове работает только в MSVC на данный момент из-за недостаточного понимания gcc нами.