|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[Дизайн и эволюция] Дискриминация шаблона на примере макроса OUT_TO_STREAM22.02.2016, 11:06. Показов 1469. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|