|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Дизайн и эволюция] Дискриминация шаблона на примере макроса OUT_TO_STREAM22.02.2016, 11:06. Показов 1504. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|