Библиотека шаблонов только для заголовков C++

Глядя на этот проект (http://www.savarese.com/software/libssrckdtree/), я нашел определение "Библиотека шаблонов только для заголовков C++". На данный момент у меня есть базовые знания C++, но я хотел бы знать, что именно это означает и почему эти люди используют его в этом проекте

9 ответов

Решение

Это означает, что все определения шаблона (шаблон функции или шаблон класса) находятся только в заголовках. Здесь нет .cpp файл. Есть только .h файлы (или некоторые другие расширения, такие как .hpp или нет расширения вообще как <vector>, string> так далее)

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

Обратите внимание на часть стандартной библиотеки C++, в которой используются такие шаблоны, как <vector>, string>, <map>и т. д. библиотека только для заголовка.

Фактически шаблоны (шаблоны классов и шаблоны функций) не могут быть скомпилированы в статическую или динамическую библиотеку для связи с программами. Шаблон, как говорит сам термин, шаблон; это не нормальный код; это только когда вы используете его в своем коде, передавая аргументы шаблона (который либо type или же value) компилятор генерирует компилируемую функцию / класс из шаблона функции / класса:

template<typename T>
struct A
{
   T data;
};

struct B
{
   int data;
};

Вот, A не может быть скомпилирован в двоичный файл (статическая библиотека или динамическая библиотека), потому что компилятор не знает, что T является. Но B может быть скомпилирован в двоичный файл, так как компилятор имеет полную информацию об этом.

Таким образом, вы можете прочитать фразу "шаблон класса A" как: A шаблон для класса A Сам не класс. Но B это класс, это не шаблон.

Как шаблон класса A не может быть скомпилирован в статическую или динамическую библиотеку для связи с вашими программами, поэтому A могут быть отправлены только как header-only библиотека с полным исходным кодом. также

Некоторые библиотеки принимают форму двоичного файла, который вы должны связать с вашим проектом, вместе с файлом заголовка, который определяет доступные классы или функции. "Библиотека только для заголовков" - это библиотека, в которой нет двоичного файла, а только заголовок, который вы включаете в свой источник.

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

Это точно означает, что библиотека перераспределяется только как заголовки. Чтобы использовать его, вам нужно только #include его в исходных файлах.

Короткий ответ: шаблоны очень похожи на макросы для компилятора, генерирующего код. Каждый раз, когда вы создаете его экземпляр (например, используя std::list<int>), компилятор должен иметь оригинальный код для вставки правильного типа (в этом случае int) в коде шаблона класса. Вот почему шаблоны классов включены в .h файлы каждый раз, когда вы должны использовать их в .cpp файлы.

Это означает, что весь код находится в заголовочных файлах; нет библиотек, связанных с библиотекой. Что это означает на практике, зависит - в худшем случае это означает, что автор никогда даже не компилировал код:-). Скорее всего, это означает, что код никогда не тестировался с точной комбинацией компилятора, версии и опций, которые вы используете, и что время компиляции значительно возрастет. С другой стороны, это означает, что вы можете использовать библиотеку, даже если у автора нет доступа к тому же компилятору, что и у вас, и вы не обязаны использовать любые параметры, которые он использовал при компиляции библиотеки. Или же, если это открытый код, вам не нужно создавать библиотеку самостоятельно.

Для библиотек шаблонов возможно предоставить все функциональные возможности только в заголовке (файлы.h), потому что традиционно компиляторам требовалось полное определение класса шаблона, чтобы создать экземпляр для данного типа. Нечего помещать в библиотеку, если только библиотека не предоставит предварительно созданные экземпляры или если есть некоторая часть библиотеки шаблонов, которая не нуждается в шаблонировании.

Это означает, что в библиотеке нет модулей, только заголовки. Это означает, что библиотеку можно использовать, не требуя, чтобы она сначала компилировалась, а затем была связана; просто включите заголовки в свои собственные исходные модули.

Преимущества этого подхода

  1. Проще включить, так как вам не нужно указывать параметры компоновщика в вашей системе сборки.
  2. Вы всегда компилируете весь код библиотеки с помощью того же компилятора (опций), что и остальной код, так как функции библиотеки встроены в ваш код.
  3. Это может быть намного быстрее.

В этом случае структура данных контейнера реализована на основе типа данных, которые она содержит, поэтому она не может быть полностью скомпилирована.

Это "только заголовок", потому что он не содержит отдельных файлов.cpp, только файлы.h, и поэтому вы можете просто #include весь код библиотеки в ваш код.

Это может быть полезно, так как вам не нужно связываться со статической библиотекой, что может быть очень болезненным.

Это означает, что вам не нужно связывать какие-либо внешние библиотеки во время фазы связывания вашей разработки. Вам нужно только загрузить библиотеку и использовать макросы #include, чтобы использовать библиотеку. Это упрощает развертывание вашего приложения в будущем, но иногда за счет более длительного времени компиляции.

Другие вопросы по тегам