Очевидно, библиотеки шаблонов должны быть только заголовочными, но для не-шаблонов, когда вы должны делать вещи только заголовками?
Если вы думаете, что ваша не шаблонная библиотека может быть только заголовочной, рассмотрите возможность деления ее на два файла в любом случае, а затем предоставьте третий файл, который включает в себя .h
и .cpp
(с защитой включения). 114]
Тогда любой, кто использует вашу библиотеку во многих различных TU и подозревает, что это может стоить много времени на компиляцию, может легко внести изменения, чтобы протестировать ее.
Как только вы узнаете, что у пользователей есть возможность использовать библиотеку, ответом, вероятно, станет «предложите эту опцию, когда это возможно». Настолько, что включение его из нескольких TU не нарушало бы ODR. Например, если ваши не static
свободные функции относятся к static
глобальным переменным, то вам не повезло, так как различные определения этой функции в разных TU будут ссылаться на разные объекты с одинаковым именем, которое является УСО-нарушение.
Библиотеки шаблонов не обязательно должны быть только заголовками: реализации вполне могут содержать некоторые части, не зависящие от параметров шаблона, и по некоторым причинам (например, меньший размер кода) разделяться на специальный двоичный файл.
Я не могу представить себе случай, когда библиотека без шаблонов действительно должна быть только для заголовков. Однако иногда это может быть разумным с точки зрения производительности, чтобы разрешить встраивание всего кода. Примером может служить библиотека оберток вокруг специфичных для платформы интерфейсов, например для таких вещей, как примитивы синхронизации, локальное хранилище потоков, специфичная для платформы и компилятора реализация атомарных операций и т. д.