Как компиляция C ++ обрабатывает разделяемую библиотеку и шаблон - PullRequest
4 голосов
/ 24 мая 2019

Однажды я где-то читал, что C ++ по существу перечисляет все возможные типы шаблонов, основанные на использовании во время компиляции, поэтому концепция шаблона не существует во время выполнения. Также кажется, что это то, что принято от Шаблон компиляции

Мой вопрос: если это так, как STL обрабатывает пользовательские типы, когда все уже скомпилировано и сделано? Это может более широко применяться к любой пользовательской библиотеке, которая скомпилирована с шаблонами.

(я мог бы спросить об этом в комментарии к ответу, но у меня недостаточно очков)

1 Ответ

6 голосов
/ 24 мая 2019

Если библиотека хочет предоставить шаблоны, экземпляры которых могут создавать ее клиенты с произвольными типами, она должна предоставить полные определения шаблонов в заголовочных файлах.Вот почему многие библиотеки C ++, включая большую часть Boost, предназначены только для заголовков.Затем компилятор получает доступ к определению шаблона и может создавать его экземпляры с любыми типами / значениями, которые клиент предоставляет в качестве аргументов шаблона.

Для получения более подробной информации по теме см. Вопрос переполнения стека Почемушаблоны могут быть реализованы только в заголовочном файле? .


Обратите внимание, что это применимо только в том случае, если, как я уже сказал, шаблоны предназначены для использования с произвольными типами.Если набор экземпляров ограничен и может быть определен во время создания разделяемой библиотеки, библиотека может создавать явные экземпляры всех шаблонов, для которых она хочет, всех комбинаций аргументов шаблона, которые она хочет поддерживать.В этом случае раскрытие определений шаблонов не является обязательным, но, разумеется, невозможно будет создавать экземпляры шаблонов с различными типами в клиентском коде.

В качестве примера можно привести некоторые геометрические библиотеки, которыепредоставить свои определения в качестве шаблонов, чтобы они могли работать как с float, так и с double для представления чисел с плавающей запятой, но не предоставлять определения шаблонов;они просто предварительно создают весь свой код с помощью float и double.Клиенты могут использовать эти экземпляры, но не могут использовать их, например, long double или MyCustomFloat.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...