Читаем Делегаты на C++ полностью

#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, содержащий этот пример, можно найти на сопровождающем компакт-диске.

<p id="IDA2OK4B">Те же и Visual C++ 6.0</p>

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

virtual TRet Invoke(TP1 p1) {

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

 return (m_pObj-›*m_pMethod)(p1);

}

Данная конструкция совершенно законна в соответствии с пунктом 6.6.3/3 Стандарта языка C++. Но VC6 об этом не знает. Поэтому нам придётся искать обходные пути. Чтобы обойти эту недоработку компилятора, необходимо отдельно реализовать все классы CDelegateX для случая TRet=void. Идеальным инструментом для этой цели служит частичная специализация шаблонов, но VC6 не поддерживает и эту возможность языка C++. В результате решение задачи на VC6 превращается в занимательную головоломку.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных