Обработка событий в С++ - [2]

Шрифт
Интервал

>  s._prev =&_head;

>  s._next = _head._next;

>  if (_head._next) _head._next->_prev =&s;

>  _head._next =&s;

> }

> template

> void _raise(Arg a) {

>  slot *p = _head._next;

>  while (p) {

>   p->_call(a);

>   p = p->_next;

>  }

> }

> void _raise() {

>  slot *p = _head._next;

>  while (p) {

>   p->_call();

>   p = p->_next;

>  }

> }

>public:

> ~signal_base() {

>  clear();

> }

>public:

> void clear() {

>  while (_head._next) _head._next->clear();

> }

>};


>template

>class signal: public signal_base {

>public:

> void raise(Arg);

>};


>typedef void VOID;


>template <>

>void signal::raise() {

> signal_base::_raise();

>}


>template

>void signal::raise(Arg a) {

> signal_base::_raise(a);

>}


> #endif // _SIGSLOT_h_  

Комментарии:  

Не всегда корректный код

Вы приводите указатель на функцию-член класса клиента к указателю на функцию из конкрентного класса (slot::Thunk), это для некоторых классов может быть невозможно, ошибка компилятора, что-то типа "указатели имеют разную природу", наблюдатась для WTL проекта, я в свое время не стал углубляться, удалось обойтись.

Кстати эта проблема нашла отражение в FLTK (библиотека типа WTL/Qt, etc., http://www.fltk.org)/– там все события вызывают статические функции с параметром-указателем this:

>static void static_cb(void* v) {

> handler* h=(handler*)v;

> h->member();

>}

В C++ указатели на функцию-член не всегда просто адрес функции, нельзя приводить указатель на функцию одного класса к указателю на функцию другого. Однако возможно есть один способ:

>template

>void call(TyClass* p_this) {(

> p_this->*f)();

>}

т.е. сделать обычную функцию с параметром this, параметризованную функцией-членом, а на эту обычную функцию уже хранить указатель.

>class foo {

> public: void f() {}

>};

>typedef void (*call_f_type)(void*);

>call_f_type call_f=(call_f_type)(call<&foo::f>);

а теперь

>foo obj;

>call_f(&obj);

Проблема здесь в том, что VC++ может не понять, что (call<&foo::f>) означает, что надо сгенерировать функцию и взять указатель на нее, ну и конечно как изменить Ваш пакет – как известно удобство важнее всего.

Интересно как это сделано в boost.

yaroslav_v 10.2.2003 17:11
делов-то

На самом деле ничего принципиально нового тут нет. Обычный callback. Чем это принципиально лучше чем ConnectionPoints из COM?

Евгений Коробко 10.2.2003 12:13
Хмм…

что-то не очень…

в Boost есть реализация подобного интересна тем, что:

• также является шаблонным классом

• слот может реагировать на несколько сигналов

• сигнал вызывает объект с перегруженным оператором (), т.е. не обязателен отдельный объект типа слот…

• можно передавать не только объект-слот, но и просто указатель на функцию и работать будет с тем же успехом…

так что, конечно неплохо, но та реализация, IMHO, лучше…

null 6.2.2003 13:10

Не хуже, чем в QT ихние эвенты. И не надо макросов гопницких

Huang Bai Wei 5.2.2003 13:40


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.