|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Дизайн и эволюция] Дискриминация шаблона на примере макроса OUT_TO_STREAM22.02.2016, 11:06. Показов 1458. Ответов 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" |
| 25.04.2017, 06:27 | |
|
0
|
|
|
Любитель чаепитий
|
|||||||
| 25.04.2017, 10:27 | |||||||
![]() но вообще погуглил на эту тему и нашёл кое-каких котов, но не знаю, все ли случаи они покрывают. пример:
0
|
|||||||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 25.04.2017, 15:34 | |
|
Больше всего мне понравилась подача материала
![]() Даже с учётом того, что на практике мне такое никогда не требовалось, прочитал с удовольствием.
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
| 25.04.2017, 16:05 | |
|
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 25.04.2017, 16:22 | ||
|
P.S. надо было щёлкнуть на porposal и ник посмотреть
0
|
||
|
Неэпический
|
|
| 25.04.2017, 16:26 | |
|
MrGluck, я конкретно про is_complete запостил,
а кто предложение вносил я не знаю.
0
|
|
| 25.04.2017, 16:26 | |
|
Помогаю со студенческими работами здесь
10
Установить иконки как в примере шаблона на главной Дизайн шаблона на дивах, съезжает футер
Перестал обновляться дизайн агентов из шаблона кто знает как выдрать дизайн шаблона на WordPress? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|