Мы создаем набор библиотек с открытым API, который будет использоваться различными третьими лицами. Некоторые из библиотек являются чистыми C, поэтому очевидно, что они имеют заголовок в стиле C с функциями и определениями структуры и соответствующей библиотекой. Они в порядке.
Некоторые библиотеки написаны с использованием умеренно сложного C ++ (нацеленного на старые компиляторы), поэтому мы реализовали некоторую форму знаменитой идиомы pimpl. Это тоже нормально.
С другой стороны, значительная часть заголовочных файлов — это C ++, использующий сильно шаблонный код. знание Почему шаблоны могут быть реализованы только в заголовочном файле? но также не желая раскрывать слишком много деталей реализации глазам, которые не должны их видеть, мы подвергли их резкому рефакторингу, чтобы исключить как можно больше внутренних деталей и иметь только действительно необходимые биты … Код оставлен.
Так что меня это озадачивает: есть ли предпочтительный способ распространения заголовочных файлов, которые в основном содержат шаблоны? Какие хорошие практики, лучшие подходы и советы и хитрости есть?
Для вдохновения посмотрите на заголовочные файлы вашего компилятора C ++. Стандартная библиотека C ++ полна шаблонов, и вы обычно найдете весь код шаблона в заголовках.
При этом, если определенные шаблоны предназначены для использования с небольшим количеством возможных классов (или значений) в качестве параметров шаблона, у вас есть возможность явно создавать экземпляры шаблонов внутри самой библиотеки, оставляя только пустые объявления шаблонов видимыми в заголовочные файлы.
Используя в качестве примера более простой сценарий до C ++ 11, библиотека C ++ обычно обеспечивает std::basic_string
реализация только для std::basic_string<char>
а также std::basic_string<wchar_t>
; и оставить кучу шаблонов кода внутри самой библиотеки, просто std::basic_string
Объявление шаблона видно в заголовочных файлах.