После повреждения нескольких недель я пытаюсь развернуть и расширить мой knowlege шаблонов с книгой Шаблоны – полное руководство David Vandevoorde и Nicolai M. Josuttis, и что я пытаюсь понять, в данный момент явное инстанцирование шаблонов.
У меня на самом деле нет проблемы с механизмом как таковым, но я не могу вообразить ситуацию, в которой я хотел бы или хотел бы использовать эту функцию. Если кто-либо может объяснить, что мне я буду более, чем благодарен.
Непосредственно скопировано с https://docs.microsoft.com / en-us / cpp / cpp / explicit-instantiation :
Вы можете использовать явное создание экземпляра для создания экземпляра шаблонного класса или функции, фактически не используя их в своем коде. Поскольку это полезно при создании файлов библиотеки (.lib), которые используют шаблоны для распространения, неустановленные определения шаблонов не помещаются в объектные (.obj) файлы.
(Например, libstdc ++ содержит явное создание экземпляра std :: basic_string
(то есть std :: string
) поэтому каждый раз, когда вы используете функции std :: string
, один и тот же код функции не нужно копировать в объекты. Компилятору нужно только сослаться (связать) их с libstdc ++.)
Если вы определяете шаблонный класс, который вы хотите работать только для пары явных типов.
Поместите объявление шаблона в файл заголовка, как обычный класс.
Поместите определение шаблона в исходный файл, как обычный класс.
Затем в конце исходного файла явно создайте экземпляр только той версии, которую вы хотите сделать доступной.
Глупый пример:
// StringAdapter.h
template<typename T>
class StringAdapter
{
public:
StringAdapter(T* data);
void doAdapterStuff();
private:
std::basic_string<T> m_data;
};
typedef StringAdapter<char> StrAdapter;
typedef StringAdapter<wchar_t> WStrAdapter;
Источник:
// StringAdapter.cpp
#include "StringAdapter.h"
template<typename T>
StringAdapter<T>::StringAdapter(T* data)
:m_data(data)
{}
template<typename T>
void StringAdapter<T>::doAdapterStuff()
{
/* Manipulate a string */
}
// Explicitly instantiate only the classes you want to be defined.
// In this case I only want the template to work with characters but
// I want to support both char and wchar_t with the same code.
template class StringAdapter<char>;
template class StringAdapter<wchar_t>;
Основной
#include "StringAdapter.h"
// Note: Main can not see the definition of the template from here (just the declaration)
// So it relies on the explicit instantiation to make sure it links.
int main()
{
StrAdapter x("hi There");
x.doAdapterStuff();
}