Александр Шаргин - Делегаты на C++

Здесь есть возможность читать онлайн «Александр Шаргин - Делегаты на C++» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Год выпуска: 2003, Издательство: The RSDN Group, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Делегаты на C++: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Делегаты на C++»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Делегаты на C++ — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Делегаты на C++», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

return true;

}

private:

TObj *m_pObj;

PMethod m_pMethod;

};

template‹class TRet TEMPLATE_PARAMS›

I_DELEGATE‹TRet TEMPLATE_ARGS›* NewDelegate(TRet (*pFunc)(PARAMS)) {

return new C_STATIC_DELEGATE‹TRet TEMPLATE_ARGS›(pFunc);

}

template ‹class TObj, class TRet TEMPLATE_PARAMS›

I_DELEGATE‹TRet TEMPLATE_ARGS›* NewDelegate(TObj* pObj, TRet (TObj::*pMethod)(PARAMS)) {

return new C_METHOD_DELEGATE‹TObj, TRet TEMPLATE_ARGS› (pObj, pMethod);

}

template‹class TRet TEMPLATE_PARAMS›

class C_DELEGATE {

public:

typedef I_DELEGATE‹TRet TEMPLATE_ARGS› IDelegate;

typedef std::list‹IDelegate*› DelegateList;

C_DELEGATE(IDelegate* pDelegate = NULL) { Add(pDelegate); }

~C_DELEGATE() { RemoveAll(); }

bool IsNull() { return (m_DelegateList.empty()); }

C_DELEGATE‹TRet TEMPLATE_ARGS›& operator=(IDelegate* pDelegate) {

RemoveAll();

Add(pDelegate);

return *this;

}

C_DELEGATE‹TRet TEMPLATE_ARGS›& operator+=(IDelegate* pDelegate) {

Add(pDelegate);

return *this;

}

C_DELEGATE‹TRet TEMPLATE_ARGS›& operator-=(IDelegate* pDelegate) {

Remove(pDelegate);

return *this;

}

TRet operator()(PARAMS) {

return Invoke(ARGS);

}

private:

void Add(IDelegate* pDelegate) {

if(pDelegate != NULL) m_DelegateList.push_back(pDelegate);

}

void Remove(IDelegate* pDelegate) {

DelegateList::iterator it;

for(it = m_DelegateList.begin(); it!= m_DelegateList.end(); ++it) {

if((*it)-›Compare(pDelegate)) {

delete (*it);

m_DelegateList.erase(it);

break;

}

}

}

void RemoveAll() {

DelegateList::iterator it;

for(it = m_DelegateList.begin(); it!= m_DelegateList.end(); ++it) delete (*it);

m_DelegateList.clear();

}

TRet Invoke(PARAMS) {

DelegateList::const_iterator it;

for (it = m_DelegateList.begin(); it != --m_DelegateList.end(); ++it) (*it)-›Invoke(ARGS);

return m_DelegateList.back()-›Invoke(ARGS);

}

private:

DelegateList m_DelegateList;

};

Вынеся обобщённый таким образом делегат в отдельный файл delegate_impl.h , мы можем сгенерировать его специализацию для любого количества параметров. Например, специализация делегата для пяти параметров получается так:

// 5 parameters…

#define SUFFIX 5

#define TEMPLATE_PARAMS \

, class TP1, class TP2, class TP3, class TP4, class TP5

#define TEMPLATE_ARGS , TP1, TP2, TP3, TP4, TP5

#define PARAMS TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5

#define ARGS p1, p2, p3, p4, p5

#include "delegate_impl.h"

#undef SUFFIX

#undef TEMPLATE_PARAMS

#undef TEMPLATE_ARGS

#undef PARAMS

#undef ARGS

Подобные фрагменты для наборов от 0 до 10 параметров можно включить в отдельный файл delegate.h , который и будут подключать пользователи делегатов.

Вот пример использования библиотеки делегатов, которую мы только что получили. Обратите внимание, что он практически полностью соответствует примеру на языке C#, с которого началась эта статья.

#include ‹iostream›

#include ‹fstream›

#include ‹string›

using namespace std;

#include "delegate.h"

class App {

public:

// Определяем делегат Callback,

// который принимает 1 параметр и ничего не возвращает.

typedef CDelegate1‹void, string› Callback;

// Это метод класса App.

void OutputToConsole(string str) { cout ‹‹ str ‹‹ endl; }

// А это статический метод класса App.

static void OutputToFile(string str) {

ofstream fout("output.txt", ios::out | ios::app);

fout ‹‹ str ‹‹ endl; fout.close();

}

};

int main() {

App app;

// Создаём делегат.

App::Callback callback = NULL;

if (!callback.IsNull()) callback("1");

// Добавляем ссылку на OutputToFile.

// Вызываем её через делегата.

callback += NewDelegate(App::OutputToFile);

if (!callback.IsNull()) callback("2");

// Добавляем ссылку на OutputToConsole.

// Вызывается вся цепочка:

// сначала OutputToFile, потом OutputToConsole.

callback += NewDelegate(&app, &App::OutputToConsole);

if (!callback.IsNull()) callback("3");

// Убираем ссылку на OutputToFile.

// Вызывается только OutputToConsole.

callback -= NewDelegate(App::OutputToFile);

if (!callback.IsNull()) callback("4");

// Убираем оставшуюся ссылку на OutputToConsole.

callback -= NewDelegate(&app, &App::OutputToConsole);

if (!callback.IsNull()) callback("5");

}

Законченный проект Visual Studio 7.0, содержащий этот пример, можно найти на сопровождающем компакт-диске.

Те же и Visual C++ 6.0

На этом можно было бы поставить точку, но остаётся ещё одна нерешённая проблема. Если вы попытаетесь скомпилировать приведённый пример в Visual C++ 6.0, у этого компилятора возникнут проблемы при задании параметра шаблона делегата TRet=void. Дело в том, что в этом случае VC6 не может корректно обработать конструкцию вида:

virtual TRet Invoke(TP1 p1) {

// VC6 полагает, что нельзя возвращать выражение типа void.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Делегаты на C++»

Представляем Вашему вниманию похожие книги на «Делегаты на C++» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Делегаты на C++»

Обсуждение, отзывы о книге «Делегаты на C++» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x