?

Log in

 
 
26 January 2007 @ 12:26 pm
Обертки и шаблонные конструкторы. Опять макросы(((  

Простая задача: есть класс A, который является наследником класса С. Как просто добавить функционал к классу А не меняя эти два класса? Надо сделать обертку B для класса А. Пример:

Усложним задачу. Пусть имеется некоторый класс обработки сообщений handler, и некоторый класс connection отвечающий за прием и отправку этих сообщений. Классическая реализация:

Что мне здесь не нравиться? Слишком много виртуальных вызовов,а я это не люблю. Сделаем на шаблонах:

Теперь сделаем обертку для handler, которая подсчитывает количество вызовов doit.

Теперь предположим, что есть класс handler2, аналогичный handler, но имеет некоторый конструктор:

Теперь объект doit_counter нельзя создать, т.к. у класса doit_counter нет соответствующего конструктора. Что далать? Создать набор шаблонных конструкторов:

Теперь doit_counter не предьявляет требований по контструкторам к базовому классу. По подобному принципу разрабатываються библиотеки migashko::filters и migashko::inet, и предпологаеться что пользователи будут разрабатывать свои классы-обертки для расширения функционала. Проблема в том, что кода конструкторов гораздо больше чем собственно добавленного функционала. Что делать? У меня одна страшная мысль - макросы?!! Но пока мне в голову ничего лучше не пришло. Итак:

Ужоснах! Зато теперь doit_counter выглядит так:

Но что делать, если классу-обертке самому небходимо инициализироваться значения через конструктор? Опять макрос:

Этот макрос создает конструкторы, у которых первый параметр принадлежит классу-обертке, а остальные передаються базовому классу. Сдесь не всо так гладко, допустим если параметр необходим и классу-обертке и базовому классу или если необходимо запретить конструктор без параметров, то придеться делать все вручную. Итак смотрим пример:

Кто подскажет как решить проблему с конструкторами не используя макросы, тому спасибо.

P.S. Конструктор копирования шаблонным конструктором не перекрываеться.

 
 
Current Location: На работе