Аннотация :
Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто поднимается вопрос о том, можно ли реализовать делегаты с аналогичными свойствами, оставаясь в рамках "чистого" C++. Оказывается, это вполне возможно. В этой статье я покажу, как это сделать.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Александр Шаргин, Вы писали:
WH>сабж. WH>см boost\signal
Ага. И не только. Кто только это не реализовывал.
Но.
а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи.
б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит.
в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте, 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) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
AS>>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит. WH>Уверен?
Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье.
Вопрос, на самом деле, достаточно интересный. Если будет свободная минутка, я проверю это и напишу сюда.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте, Alexander Shargin, Вы писали:
AS>а) Статья писалась в учебных целях, чтобы показать на не очень навороченном примере как делаются такие вещи. AS>б) Код писался с прицелом на VC (в т. ч. 6.0), который с boost'ом не дружит. AS>в) Мне просто было интересно дойти до этого самому и получить удовольствие от процесса.
От меня тебе огромное спасибо Александр. Мне твоя очень вовремя попалась, как раз когда я для своего COM сервера пытался реализовать обратную связь с клиентом, т.е. поддержку событийных интерфейсов. Я как раз размышлял об эффективном и с возможностью повторного использования кода реализации интерфейса IMyEvent и прочитав твою статью я практически пришел к моментальному выводу. Пишем объект делегат, который регестрируется под объектмом event slot, идея написания которого пришла после прочтения статьи "Обработка событий в С++", которая обитает здесь же. Объект eventSlot and EventRaiser я конечно несколько по своему модернизировал, а вот твой делегат мне понравился. EventRaiser реализует сервер, а eventSlot клиент и после написания интерфейсов это все уже почти прекрасно работает.
Единственное но, в твоем делегате была скрытая утечка памяти, которую я уже устранил и хочу тебе вернуть конечный полностью работоспособный результат твоей работы. Куда положить файлы?
Здравствуйте, 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. Спасибо заранее!
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте, Alexander Shargin, Вы писали:
AS>На сайт попала не самая последняя версия статьи. В ближайшее время я буду обновлять её. Заодно исправлю и эту проблему. Код можно прислать мне по email: rudankort@rsdn.ru. Спасибо заранее!
Здравствуйте, Alexander Shargin, Вы писали:
AS>Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье.
boost на 100% вроде не компилит ни один компилятор, но частично он прекрасно компилируется и работает на очень многих. Какие части и чем компилятся надо смотреть в документации к конкретной части.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, yaroslav_v, Вы писали:
>>Дело в том, что в языке C++ операторы не наследуются. _>Это не верно по крайней мере для MSVC++.
Это неверно не только для MSVC.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Alexmoon, Вы писали:
A>...как раз когда я для своего COM сервера пытался реализовать обратную связь с клиентом, т.е. поддержку событийных интерфейсов.
хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?
Здравствуйте, Odi$$ey, Вы писали:
OE>хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?
Кто сказал, что он не угодил. Что такое IConnectionPoint? Это интерфейс регистрации на сервере интерефейсов IMyEvent.
Вот о реализации последних я и рассказывал.
Здравствуйте, Alexmoon, Вы писали:
OE>>хм, кстати о велосипедах, а IConnectionPoint -то чем не угодил?
A>Кто сказал, что он не угодил. Что такое IConnectionPoint? Это интерфейс регистрации на сервере интерефейсов IMyEvent. A>Вот о реализации последних я и рассказывал.
в сервере делаем стандартную реализацию
class CProxy_IххххххххEvents : public IConnectionPointImpl<...>
{
public:
HRESULT Fire_xxxxxxxxx()
//и т.д. с перебором точек соединения и вызовом для каждой pDispatch->Invoke
клиент подписывается через Advise и имеет информацию обо всех событиях.
я таки пытаюсь понять где тут место для самодельных слотов и делегатов и почему мне это не разу не понадобилось, может я много чего потерял
Здравствуйте, Odi$$ey, Вы писали:
OE>клиент подписывается через Advise и имеет информацию обо всех событиях.
OE>я таки пытаюсь понять где тут место для самодельных слотов и делегатов и почему мне это не разу не понадобилось, может я много чего потерял
да ничего ты не потерял. просто у меня есть свои мысли и идеи по поводу реализации подобных вещей и я просто упомянул область, где мне пригодится делегат, а не выставлял на обсуждение собственный вариант реализации.
можно обойтись и без него. а я хочу с ним ). И по эффективности будет тоже самое, но хочу попробовать альтернативный вариант.
Тяжело в форуме объяснить все свои мысли и поэтому я вернусь к обсуждению этого только после окончания работы.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Alexander Shargin, Вы писали:
AS>>Возможно, с тех пор ситуация изменилась. А возможно, я заблуждался с самого начала. В чистом виде boost не компилируется на VC6 и это факт, но не исключено, что его удалось портировать примерно так же, как я это делал в своей статье. WH>boost на 100% вроде не компилит ни один компилятор, но частично он прекрасно компилируется и работает на очень многих. Какие части и чем компилятся надо смотреть в документации к конкретной части.
Судя по информации здесь: http://www.boost.org/doc/html/ch04s02.html, Visual C++ не понимает сигналы с "нормальным" синтаксисом, но понимает их с "портабельным" синтаксисом. С чем себя и всех и поздравляю.
В портабельном синтаксисе, в отличае от нормального, количество параметров необходимо указывать в имени класса: signal0, а не signal.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...