Быстрые делегаты C++ - Использование кода

ОГЛАВЛЕНИЕ

Использование кода

Предпочтительный синтаксис и переносимый синтаксис

#include "delegate.h"
// Предпочтительный синтаксис

fd::delegate < void (int, char *) > dg;
#include "delegate.h"
// Переносимый синтаксис

fd::delegate2 < void, int, char * > dg;

Предпочтительный синтаксис может быть принят только относительно новыми совместимыми со стандартами C++ компиляторами, такими как VC7.1 или выше, или GNU C++ 3.XX, в то время как переносимый синтаксис должен поддерживаться большинством компиляторов (полагаем, что наш быстрый делегат может быть легко перенесен в другие компиляторы без значительных проблем, так как он работал даже в печально известном VC6). (Замечание: Наш делегат был проверен только в VC6, VC7.1, и DEV-C++ 4.9.9.2 (Mingw/gcc 3.4.2).)

Если поддерживаются предпочтительный и переносимый синтаксисы, то можно использовать оба синтаксиса в комбинации (копирование, сравнение, создание копий, присваивание и так далее). Поэтому все примеры кода в дальнейшем будут показаны в переносимом синтаксисе.

Обертывание трех вызываемых сущностей

Вызываемая сущность имеет вызов функции operator (), и в число трех вызываемых сущностей входят:

  • Свободные функции (включая статические функции-члены),
  • Функции-члены, и
  • Функторы (функции-объекты).

Эти три вызываемые сущности могут быть присвоены fd::delegate довольно простым образом, как boost::function, за исключением функторов.

// ======================================================================

// пример целевых вызываемых сущностей

// ======================================================================


class CBase1
{
public:
  void foo(int n) const { }
  virtual void bar(int n) { }
  static void foobar(int n) { }
  virtual void virtual_not_overridden(int n) { }
};

// ------------------------------


class CDerived1 : public CBase1
{
  std::string name_;

public:
  explicit CDerived1(char * name) : name_(name) { }
  void foo(int n) const
 { name_; /*делаем что-то с name_ или с этим указателем*/ }
  virtual void bar(int n) { name_; /* делаем что-то с name_ или с этим указателем */ }
  static void foobar(int n) { }
  void foofoobar(CDerived1 * pOther, int n)
 { name_; /* делаем что-то с name_ или с этим указателем */ }
};

// ------------------------------


void hello(int n) { }
void hellohello(CDerived1 * pDerived1, int n) { }

// ------------------------------


struct Ftor1
{ // функтор, не запоминающий состояние

  void operator () (int n)
 { /*если нет состояния, то этот указатель не используется*/ }
};

struct Ftor2
{ // функтор, запоминающий состояние

  string name_;
  explicit Ftor2(char * name) : name_(name) { }
  void operator () (int n)
 { name_; /* делаем что-то с name_ или с этим указателем */ }
};