Быстрые делегаты 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_ или с этим указателем */ }
};