Делегаты на C++
От: Александр Шаргин Россия RSDN.ru
Дата: 30.04.03 05:55
Оценка: 517 (18)
Статья :
Делегаты на C++
Автор(ы): Александр Шаргин
Дата: 19.03.2003
Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто поднимается вопрос о том, можно ли реализовать делегаты с аналогичными свойствами, оставаясь в рамках "чистого" C++. Оказывается, это вполне возможно. В этой статье я покажу, как это сделать.


Авторы :
Александр Шаргин

Аннотация :
Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто поднимается вопрос о том, можно ли реализовать делегаты с аналогичными свойствами, оставаясь в рамках "чистого" C++. Оказывается, это вполне возможно. В этой статье я покажу, как это сделать.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
наследование операторов
От: yaroslav_v http://yaroslav-v.chat.ru
Дата: 01.05.03 05:55
Оценка:
>Дело в том, что в языке C++ операторы не наследуются.
Это не верно по крайней мере для MSVC++.
Более того этот метод используется при написании функтора из библиотеки Loki
http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport (файл Functor.h),
см. также http://www.geocities.com/rani_sharoni/LokiPort.html (VC7) и конечно
оригинал http://moderncppdesign.com/

#include <stdio.h>
int main()
{
struct base
{
void operator()(int x)
{
printf("void base::operator()(%d)\n",x);
}
};
struct derived : base
{
};
derived()(5);
return 0;
}
Велосипед
От: WolfHound  
Дата: 18.06.03 18:04
Оценка: +2
Здравствуйте, Александр Шаргин, Вы писали:

сабж.
см boost\signal
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Велосипед
От: Alexander Shargin Россия RSDN.ru
Дата: 18.06.03 18:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Александр Шаргин, Вы писали:


WH>сабж.

WH>см boost\signal

Ага. И не только. Кто только это не реализовывал.

Но.
а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи.
б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.
в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[2]: Велосипед
От: WolfHound  
Дата: 19.06.03 03:56
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.

Уверен?
Preferred syntax 
GNU C++ 2.95.x, 3.0.x, 3.1.x

Comeau C++ 4.2.45.2

SGI MIPSpro 7.3.0

Intel C++ 5.0, 6.0

Compaq's cxx 6.2
 Any compiler supporting the preferred syntax

Portable syntax 

Microsoft Visual C++ 6.0, 7.0

Borland C++ 5.5.1

Sun WorkShop 6 update 2 C++ 5.3

Metrowerks CodeWarrior 8.1
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Велосипед
От: Alexander Shargin Россия RSDN.ru
Дата: 19.06.03 07:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

AS>>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.

WH>Уверен?

Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье.

Вопрос, на самом деле, достаточно интересный. Если будет свободная минутка, я проверю это и напишу сюда.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re: Велосипед
От: MaximE Великобритания  
Дата: 19.06.03 07:14
Оценка: 2 (1)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Александр Шаргин, Вы писали:


WH>сабж.

WH>см boost\signal

Еще есть Libsigc++, но она больно уж под Unix заточена.
Re[2]: Велосипед
От: Alexmoon Украина  
Дата: 19.06.03 08:35
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи.

AS>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.
AS>в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.

От меня тебе огромное спасибо Александр. Мне твоя очень вовремя попалась, как раз когда я для своего COM сервера пытался реализовать обратную связь с клиентом, т.е. поддержку событийных интерфейсов. Я как раз размышлял об эффективном и с возможностью повторного использования кода реализации интерфейса IMyEvent и прочитав твою статью я практически пришел к моментальному выводу. Пишем объект делегат, который регестрируется под объектмом event slot, идея написания которого пришла после прочтения статьи "Обработка событий в С++", которая обитает здесь же. Объект eventSlot and EventRaiser я конечно несколько по своему модернизировал, а вот твой делегат мне понравился. EventRaiser реализует сервер, а eventSlot клиент и после написания интерфейсов это все уже почти прекрасно работает.

Единственное но, в твоем делегате была скрытая утечка памяти, которую я уже устранил и хочу тебе вернуть конечный полностью работоспособный результат твоей работы. Куда положить файлы?
Re[3]: Велосипед
От: Alexander Shargin Россия RSDN.ru
Дата: 19.06.03 08:45
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>Здравствуйте, Alexander Shargin, Вы писали:


AS>>а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи.

AS>>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.
AS>>в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.

A>От меня тебе огромное спасибо Александр. Мне твоя очень вовремя попалась, как раз когда я для своего COM сервера пытался реализовать обратную связь с клиентом, т.е. поддержку событийных интерфейсов. Я как раз размышлял об эффективном и с возможностью повторного использования кода реализации интерфейса IMyEvent и прочитав твою статью я практически пришел к моментальному выводу. Пишем объект делегат, который регестрируется под объектмом event slot, идея написания которого пришла после прочтения статьи "Обработка событий в С++", которая обитает здесь же. Объект eventSlot and EventRaiser я конечно несколько по своему модернизировал, а вот твой делегат мне понравился. EventRaiser реализует сервер, а eventSlot клиент и после написания интерфейсов это все уже почти прекрасно работает.


A>Единственное но, в твоем делегате была скрытая утечка памяти, которую я уже устранил и хочу тебе вернуть конечный полностью работоспособный результат твоей работы. Куда положить файлы?


На сайт попала не самая последняя версия статьи. В ближайшее время я буду обновлять её. Заодно исправлю и эту проблему. Код можно прислать мне по email: rudankort@rsdn.ru. Спасибо заранее!
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[4]: Велосипед
От: Alexmoon Украина  
Дата: 19.06.03 08:57
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>На сайт попала не самая последняя версия статьи. В ближайшее время я буду обновлять её. Заодно исправлю и эту проблему. Код можно прислать мне по email: rudankort@rsdn.ru. Спасибо заранее!


Выслал файлы на email.
Re[4]: Велосипед
От: WolfHound  
Дата: 19.06.03 09:04
Оценка:
Здравствуйте, Alexander Shargin, Вы писали:

AS>Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье.

boost на 100% вроде не компилит ни один компилятор, но частично он прекрасно компилируется и работает на очень многих. Какие части и чем компилятся надо смотреть в документации к конкретной части.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: наследование операторов
От: Lorenzo_LAMAS  
Дата: 19.06.03 09:35
Оценка:
Здравствуйте, yaroslav_v, Вы писали:

>>Дело в том, что в языке C++ операторы не наследуются.

_>Это не верно по крайней мере для MSVC++.
Это неверно не только для MSVC.
Of course, the code must be complete enough to compile and link.
Re[3]: Велосипед
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.06.03 09:47
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>...как раз когда я для своего COM сервера пытался реализовать обратную связь с клиентом, т.е. поддержку событийных интерфейсов.


хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?
Re[4]: Велосипед
От: Alexmoon Украина  
Дата: 19.06.03 10:00
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?


Кто сказал, что он не угодил. Что такое IConnectionPoint? Это интерфейс регистрации на сервере интерефейсов IMyEvent.
Вот о реализации последних я и рассказывал.
Re[5]: Велосипед
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.06.03 10:43
Оценка:
Здравствуйте, Alexmoon, Вы писали:

OE>>хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?


A>Кто сказал, что он не угодил. Что такое IConnectionPoint? Это интерфейс регистрации на сервере интерефейсов IMyEvent.

A>Вот о реализации последних я и рассказывал.

в сервере делаем стандартную реализацию

class CProxy_IххххххххEvents : public IConnectionPointImpl<...>
{
public:
     HRESULT Fire_xxxxxxxxx()

  //и т.д. с перебором точек соединения и вызовом для каждой pDispatch->Invoke


клиент подписывается через Advise и имеет информацию обо всех событиях.

я таки пытаюсь понять где тут место для самодельных слотов и делегатов и почему мне это не разу не понадобилось, может я много чего потерял
Re[2]: наследование операторов
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 19.06.03 10:52
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

хъ

Это частично не верно.
Re[6]: Велосипед
От: Alexmoon Украина  
Дата: 19.06.03 11:00
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>клиент подписывается через Advise и имеет информацию обо всех событиях.


OE>я таки пытаюсь понять где тут место для самодельных слотов и делегатов и почему мне это не разу не понадобилось, может я много чего потерял


да ничего ты не потерял. просто у меня есть свои мысли и идеи по поводу реализации подобных вещей и я просто упомянул область, где мне пригодится делегат, а не выставлял на обсуждение собственный вариант реализации.
можно обойтись и без него. а я хочу с ним ). И по эффективности будет тоже самое, но хочу попробовать альтернативный вариант.
Тяжело в форуме объяснить все свои мысли и поэтому я вернусь к обсуждению этого только после окончания работы.
Re[3]: наследование операторов
От: Lorenzo_LAMAS  
Дата: 19.06.03 11:09
Оценка:
AS>Это частично не верно.

Ну что ж, давай пример
Of course, the code must be complete enough to compile and link.
Re[5]: Велосипед
От: Alexander Shargin Россия RSDN.ru
Дата: 19.06.03 11:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Alexander Shargin, Вы писали:


AS>>Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье.

WH>boost на 100% вроде не компилит ни один компилятор, но частично он прекрасно компилируется и работает на очень многих. Какие части и чем компилятся надо смотреть в документации к конкретной части.

Судя по информации здесь: http://www.boost.org/doc/html/ch04s02.html, Visual C++ не понимает сигналы с "нормальным" синтаксисом, но понимает их с "портабельным" синтаксисом. С чем себя и всех и поздравляю.

В портабельном синтаксисе, в отличае от нормального, количество параметров необходимо указывать в имени класса: signal0, а не signal.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re[3]: Велосипед
От: Юнусов Булат Россия  
Дата: 19.06.03 12:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

Тогда в бусте официально вроде не было сигналов.

У меня все ходы записаны
Делегаты на C++
Автор: Александр Шаргин
The RSDN Group
Опубликовано: 28.01.2002
Версия текста: 1.0



October 10, 2002 - Version 1.29.0
Signals Library added - Managed signals & slots callback implementation, from Doug Gregor.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.