ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Пятница
12 августа
1164691 Топик полностью
RxTx (14.01.2022 22:16 - 22:45, просмотров: 171) ответил Evgeny_CD на Размер шаблона никак не связан с размером кода. Шаблоны мощная штука, понять их сильно не просто. Я вот не шибко силен в понимании.
Я объясню. 

Начнем с примера. Что такое препроцессор C? Препроцессор работает на самом деле с текстом, ничего не зная о семантике программы. Изначально это отдельная программа-утилита, запускающаяся отдельным шагом до компиляции. Но применяя препроцессор, программист влияет на свою программу и в конечном итоге на семантику. Важно что препроцессор - не сама полезная программа. Это средство манипуляции текстом программы. Поэтому он находится над программой, в более высокоуровневой, над-(мета-) области. Так вот, названное "шаблонами", на самом деле должно называться "расширенный препроцессор" и это точное название, зная которое становится ясна суть. Страуструпу не нравилось что препроцессор был отдельный и никак не связан с языком. (стр 343. прилагаемой книги, только его пространные разглагольствования нужно еще суметь прочесть, ключ во фразе "Еще со времен C with Classes мы пользовались макросами для параметризации контейнеров"). Он смешал язык и препроцессор, наделив препроцессор возможностью учитывать при работе как встроенные языковые типы, так и определяемые пользователем. Вот в общем-то и всё, что нужно знать о "шаблонах". (И еще можно поспорить, а было ли здравым решение встроить препроцессор в язык). Отныне всякий раз как вы слышите о "шаблонах", мысленно переименовывайте этот термин в "расширенный препроцессор кода", ибо это так и есть. И теперь понятно, чем именно упиваются любители шаблонов, говоря то что это нельзя воспроизвести в C. Ну да, это очевидно. Симуляция методами C работы внешнего по отношению к полезной С/C++ программе препроцессора либо и вовсе невозможна, либо затратна, так как её никак не сделать без run-time, без отработки самой программы (без привлечения процессорных инструкций). Также, при использовании препроцессора (т.е. шаблонов) для программиста открыта своеобразная новая парадигма программирования. А именно, можно как бы "навесить" на фрагменты программы/данных некие "признаки" (квалификаторы, тэги). Роль этих квалификаторов в C++ шаблонах выполняют введенные пользователем типы. И во время работы препроцессора, т.е. при компиляции эти квалификаторы (типы) можно разумно по определенным правилам обработать, оптимально собрав (препроцессировав) таким образом, конечную итоговую программу. Возня по препроцессированию программы называется "метапрограммированием". Ясно что препроцессор отрабатывает ДО полезной программы, поэтому все гордые заявления C++ программистов, (которые попросту не понимают чем именно являются шаблоны) попросту смешны, когда они упиваются тем что "это не занимает кода", итд. Ну да, конечно не занимает кода, потому что это результат препроцессирования, а не рабочая итоговая программа. Все заявления о компактности получаемых инструкций либо вытекают из самого факта препроцессирования, либо являются результатом высокой оптимизации современных компиляторов, которые удаляют всё лишнее.

Единственное, что следует добавить, это то что метапрограммирование (комплекс мер по препроцессированию) выполняется не простым и явным языком, который имея достаточную догадливость можно было бы ввести, и который позволил бы получить итоговый препроцессированный текст программы (процесс, называемый в терминах C++ "выводом шаблона"). Вместо языка по анализу и обработке программы исходно был введен достаточно сложный и запутанный набор правил, выполняя которые в итоге получился конечный текст. Именно над фактом выполнения правил удалось хоть и изврашенным образом, но все же построить программирование. Вопрос, зачем оно нужно? А дело в том, что шаблон (пустой, еще не параметризованный текст программы) обычно находится в бибилиотеке, и ничего не знает о том, чем именно, каким именно кодом/типом/данными его будут параметризовать (т.е. что подставят). И вот этот набор правил, применяемый в качестве своеобразного как-бы-языка и позволяет в конечном итоге получать "умный" выбор того или иного кода, "умную" подстановку (умный - то есть с неким разумным поведением, ну например если параметризуют int то вплоть до того что выбрать один код, а если параметризуют float выбрать совсем другой код, т.е. алгоритм). Это и есть "метапрограммирование" на шаблонах. Конечно, чтобы заниматься всем этим, необходимо было глубоко знать систему правил по которым компилятор действует при работе с шаблонами (т.е. при препроцессировании).

Это самая необходимая база, которую требуется знать о шаблонах C++ и о парадигме работы с ними.

Русское метафизическое подполье