8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Дизайн и эволюция] Дискриминация шаблона на примере макроса OUT_TO_STREAM22.02.2016, 11:06. Показов 1168. Ответов 9
Метки нет (Все метки)
рублика:
дизайн и эволюция название: дискриминация шаблона на примере макроса OUT_TO_STREAM категории: с++, ненормальное программирование, для настоящих ценителей. Часть 0. вступление. всем привет. дискриминатор - это конструкция, которая существует множество разновидностей дискриминаторов. объединяет их то, что они используют неочевидные где то на пределах возможностей языка. например, можно поиметь эффект "повторного инстанцирования" шаблона. при этом, предыдущий инстанс - дискриминируется, как бы списывается на берег, выбрасывается нафиг, сливается в клоаку, девочки его больше не любят. Кликните здесь для просмотра всего текста
изначально, где то на просторах интернетов, я нашел пример-иллюстрацию шаблона, у которого один из параметров так и назывался: discriminator в качестве значения дискриминатора, через макрос подставлялся __COUNTER__ что приводило к тому, что шаблон инстанцировался каждый раз заново. погремушка закрепилась, и в дальнейшем я начал называть дискриминаторами любые трюки, которые с шаблонами что-то очень странное. помимо __COUNTER__ есть и другие способы добиться аналогичного эффекта. один из них, весьма экзотичный, имеет особенный эффект: реагирует на неполные типы. к сожалению, к настоящему моменту материал по этой теме ещё не готов. пока могу предложить лишь пищу для размышлений: Кликните здесь для просмотра всего текста
изначально дискриминатор потребовался для реализации
шаблона is_complete<type>::value который вернет true, если тип полный. пример:
мне удалось добиться только 3х ответов: да, нет, не знаю. в рамках с++11 использовал необычный трюк:
что позволяет, о боже! наделить компалтайм вычисление переменным состоянием. материал по is_complete уже почти готов, так что скоро я его опубликую. другая - взять под контроль конкурс претендентов на инстанцирование среди перегрузок. именно этой технике и посвящается данный материал. Часть 1. макрос OUT_TO_STREAM это - наш подопытный кролик, на примере которого я решил проиллюстрировать технику в действии. сначала я приведу детальное описание более ранней версии макроса. и опишу возникшую с ним проблему. а затем проиллюстрирую, как при помощи дискриминатора, можно эту проблему решить. встречайте:
дружественных функций ввода/вывода объекта в stl-совместимые потоки на них налагаются требования: 1. если вывод в поток не используется, то подключать #include <iostream> не обязательно. 2. универсальность. можно работать не только с std::iostream, но и слюбыми stl-совместимыми потоками. однако, представленная версия OUT_TO_STREAM обладает серьёзным недостатком, которая ломает весь дизайн:
и нужно поддерживать оби версии? и вот здесь дизайн ломается, и начинаются приседания с бубнами. а хочется простоты. хочется простого дизайна:
просто в любой момент можно добавить специализацию. Часть 3. Дискриминация шаблона. представленный выше дизайн весьма удобен в использовании. но для его реализации нужно решить сразу две инженерные задачи. первая связанна с тем, что макрос для общего случая, и макрос для специализации должны раскрываться в принципиально различный текст кода. что бы такое провернуть, потребуется реализовать перегрузку макросов под разное количество аргументов. как это сделать я расписывал раннее: https://www.cyberforum.ru/cpp-... ost8733668 вторая проблема заключается в том, что по задумке получается, что если специализация отсутствует, должна запуститься общая версия. а это значит, что параметры специализаций априори подходят под параметры общей версии. а поскольку перегрузки участвуют в конкурсе на общих основаниях, то получаем неоднозначность выбора: компилятор не сможет понять, какую нужно выбрать версию: общую, или специализацию. что бы решить эту проблему, нужно каким то образом понизить приоритет выбора общей версии шаблона что бы компилятор в первую очередь рассматривал именно специализации. и только если они не подошли, стал бы рассматривать общий случай. и вот здесь проблема: вы нигде не найдете точных правил по которым определяется приоритет выбора претендента. стандарт про это говорит крайне мало: "выбрана должна быть наиболее подходящая версия" однако, существует общее правило здравого смысла: чем меньше что бы провалидировать аргументы, тем выше приоритет выбора у претендента. то бишь, в первую очередь компиляторы рассматривают нешаблонные версии где вообще не нужно затем рассматривают шаблоны попроще, затем посложнее, и тд. если на каком ни будь этапе аргументы шаблона впишутся без необходимости каста, то все, конкурс заканчивается. другие шаблоны компилятор не рассматривает, а значит и не инстанцирует. именно на этой особенности базируется данный дискриминатор: мы исскуственно усложняем общую версию шаблона так, что бы в итоге конструкция оставалась эквивалентна более простой первичной версии. но при этом, из-за переусложнения, компиляторы начнут рассматривать его только после более простых специализаций. итак, проиллюстрирую решение на практике:
второй шаблон замороченный. у него целых три. из которых 3й зависит от 2го, а 2й выводится по умолчанию. это дает такую нагрузку на парсинг, что компилятор вижал студии, жосиси, и шланг сразу же между любыми двумя перегрузками всегда можно вставить ещё один дискриминирующий параметр по умолчанию, и однозначно понизить приоритет перегрузки. и таким образом становится возможным контролировать приоритеты любых шаблонно-перегрузок, на этом все. всем пока.
6
|
22.02.2016, 11:06 | |
Ответы с готовыми решениями:
9
Дизайн и эволюция: перегрузка макросов [дизайн и эволюция] провалы в variadic конструкторы Прикол: Эволюция программиста на примере "Hello world" Установить иконки как в примере шаблона на главной |
GbaLog-
|
25.04.2017, 06:27
#2
|
0
|
Любитель чаепитий
|
||||||
25.04.2017, 10:27 | 4 | |||||
да если бы я хоть представлял, как оно должно работать.
но вообще погуглил на эту тему и нашёл кое-каких котов, но не знаю, все ли случаи они покрывают. пример:
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
25.04.2017, 16:05 | 7 |
Неужто hoggy на https://stdcpp.ru proposal протащил?
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
25.04.2017, 16:22 | 9 |
Значит в РГ это посчитали действительно чем-то важным. Как они говорили на последней встрече, комментарий от страны - максимальная мера, которую они могут сделать. Потому что пока на этот комментарий не дадут вердикт, коммитет не может двигаться дальше, а они это не любят.
P.S. надо было щёлкнуть на porposal и ник посмотреть
0
|
Неэпический
|
|
25.04.2017, 16:26 | 10 |
MrGluck, я конкретно про is_complete запостил,
а кто предложение вносил я не знаю.
0
|
25.04.2017, 16:26 | |
25.04.2017, 16:26 | |
Помогаю со студенческими работами здесь
10
Дизайн шаблона на дивах, съезжает футер Задать странице шаблона уникальный дизайн Перестал обновляться дизайн агентов из шаблона кто знает как выдрать дизайн шаблона на WordPress? Однократный запуск макроса при создании документа из шаблона Создание макроса для открытия существующего шаблона Word из Exel Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |