Шаблон, динамическое значения параметра шаблона, параметр не является типом |
Здравствуйте, гость ( Вход | Регистрация )
Шаблон, динамическое значения параметра шаблона, параметр не является типом |
ViGOur |
18.2.2013, 15:09
Сообщение
#21
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Можно какой нибудь пример использования? Легко, правда это не мой пример, долго объяснять, потому не буду, дам пример по проще, но суть будет примерно та же...Пишется модуль по работе с протоколами, пускай они будут подключаться как плагины. На данный момент мы должны уметь подключать к нему такие протоколы как HTTP и FTP. А если понадобиться позднее подключать SNMP. А еще позже SMTP, POP3, IMAP. А в конце концов скажут подключаем прикрутит еще чего, как ты будет закладываться на все это? |
|
|
lanz |
18.2.2013, 16:47
Сообщение
#22
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Можно так, с учетом пунктов 1, 3.
Вместо енума можно использовать текстовые идентификаторы например(или генерить на лету). Тогда и пт. 2 сильно не влияет. В загрузку плагина не забудешь запихнуть регистрацию класса(а если и забудешь, легко ловится тестами). А еще без перекомпиляции при изменении enuma Раскрывающийся текст
|
|
|
ViGOur |
19.2.2013, 10:08
Сообщение
#23
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Честно говоря, ИМХО особо ничего не поменялось...
Мне вот вспомнилась задачка от яндекса, при тестировании знаний перед собеседованием: Есть класс CodeGenerator, который умеет генерить код на разных языках.
Исходя из предположения, что количество языков будет увеличиваться, предложите refactoring кода. Аргументируйте преимущество вашего кода над существующим. ( Оригинал ) |
|
|
lanz |
19.2.2013, 11:50
Сообщение
#24
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата 1. Данный код только для класса CAnimal и производных от него классов. ( я понимаю, что можно поправить, но все же! ) Теперь шаблон. Цитата 2. При добавлении типа в CEnumClass::eEnum, тебе так же нужно будет добавлять прототип функции в массив creators. (если забыл добавить, то ... ) Вместо этого регистрация (=1 действие), но тут никуда не дется, если берем за референс реализацию с рекурсивными шаблонами, то там придется добавлять enum + делать полную специализацию CClass (=2 действия) Два действия забыть проще .) Цитата 3. Ты должен будешь соблюдать порядок типов в CEnumClass::eEnum и прототипов функций в массиве creators. (если порядок другой, то ...) При регистрации порядок неважен. В задаче от яндекса то же, только в профиль. Немного интересней, что зависимые от языка вещи находятся в двух местах, но это непринципиально, сюда тоже можно сунуть фабрику. Плюсы - только уменьшеие количества мест, которые нужно исправить при переделке и как следствие повышение багоустойчивости. Минусы - усложненная архитектура. Вообще switch неплох, когда у нас участвует менее 6-7 элементов. Поэтому при прочих равных, я бы максимум убрал второй switch. Как то так. Раскрывающийся текст
|
|
|
Iron Bug |
19.2.2013, 16:25
Сообщение
#25
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
знаешь, я вообще перечитала твою тему с начала и подумала, что я тут уже писала на этот счёт. только у меня задача сложнее была, с библиотеками, но смысл был совершенно тот же.
у меня была задача сделать плагины к существующему коду так, чтобы плагины было можно подцеплять отдельно, динамически, не трогая весь остальной код. и чтобы они наследовали общее поведение в некоторых методах. http://www.forum.crossplatform.ru/index.php?showtopic=6472 |
|
|
ViGOur |
19.2.2013, 16:52
Сообщение
#26
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Да я уже сдела что хотел и вылодил описание как...
Просто lanz, предлагает свое решение, которое мне явно не подходит. |
|
|
lanz |
19.2.2013, 16:57
Сообщение
#27
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Почему, ну почему-же не подходит?!
|
|
|
ViGOur |
19.2.2013, 20:56
Сообщение
#28
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Почему, ну почему-же не подходит?! А вот почему:"Код"
1. добавить его в enum Lang перед LANG_END. 2. добавить специализацию шаблона langCodeGenerator для него: И не более того!
|
|
|
lanz |
20.2.2013, 9:14
Сообщение
#29
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Ну да, но если сравнивать:
Раскрывающийся текст
Минусы - оверхед на регистрацию + оверхед на хранение, если забыть зарегистрировать - ничего не заработает (будет ошибка времени выполнения, а не времени компиляции), слишком усложненное использование для небольшого числа объектов. Плюсы - читается лучше(при всей моей любви к шаблонам, рекурсивные шаблоны - это "особая шаблонная магия"), не надо перекомпилировать все классы языков при добавлении нового (это кстати позволит разнести их по дллкам например и загружать динамически), в вашем решении каждый вызов instance будет рекурсивным и пробегатся по всей иерархии шаблонов (т.е. получится тот же switch, только "размазанный по коду". |
|
|
ViGOur |
20.2.2013, 9:47
Сообщение
#30
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Со всем в принципе согласен, но как я уже говорил под мои нужды это самое то!
У меня уже за 20 разных объектов в enum'е и думается мне их прибавится! И если что-то не так, то лучше узнать об этом на этапе компиляции... |
|
|
Текстовая версия | Сейчас: 2.1.2025, 20:55 |