Быстрые делегаты C++ - Свободные функции

ОГЛАВЛЕНИЕ

Свободные функции

// создание копии

fd::delegate1 < void, int > dg1(&::hello);
fd::delegate1 < void, int > dg2 = &CBase1::foobar;

dg1(123);
dg2(234);

// присваивание

fd::delegate < void, int > dg3;
dg3 = &CDerived1::foobar;

dg3(345);

Функции-члены (Адаптер функции-члена)

CBase1 b1; CDerived1 d1("d1");

// создание копии
fd::delegate2 < void, CBase1 *, int > dg1(&CBase1::foo); // адаптер указателя
fd::delegate2 < void, CBase1 &, int > dg2 = &CBase1::bar; // адаптер ссылки


dg1(&b1, 123);
dg2(b1, 234);

// присваивание

fd::delegate2 < void, CDerived1 *, int > dg3;
dg3 = &CDerived1::foo;

dg3(&d1, 345);

Это может быть не тем, чего вы хотели достигнуть. Вы можете хотеть объявить делегат так: fd::delegate1 <void, int >, а не так: fd::delegate2 < void, CBase1 *, int >. В таком случае это называется связыванием аргументов для функции-члена и будет описано позже.

// взято из сетевой документации boost::function 
template < typename P >
R operator()(cv-quals P& x, Arg1 arg1, Arg2 arg2, ..., ArgN argN) const
{
  return (*x).*mf(arg1, arg2, ..., argN);
}

Интересно, что функцию-член можно адаптировать и вызвать, как показано выше. Хотя мы использовали boost::function таким образом, возникала иллюзия, что таким же образом вызывается сырой указатель функции-члена, и мы даже пробовали это сделать (компилятор сообщил об ошибке). Это специальное условие, и такая иллюзия вызывается огромным количеством внутреннего кода. Мы назвали это адаптером функции-члена.