Явное инстанцирование - когда это используется?

После повреждения нескольких недель я пытаюсь развернуть и расширить мой knowlege шаблонов с книгой Шаблоны – полное руководство David Vandevoorde и Nicolai M. Josuttis, и что я пытаюсь понять, в данный момент явное инстанцирование шаблонов.

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

73
задан jogojapan 1 March 2013 в 13:52
поделиться

2 ответа

Непосредственно скопировано с https://docs.microsoft.com / en-us / cpp / cpp / explicit-instantiation :

Вы можете использовать явное создание экземпляра для создания экземпляра шаблонного класса или функции, фактически не используя их в своем коде. Поскольку это полезно при создании файлов библиотеки (.lib), которые используют шаблоны для распространения, неустановленные определения шаблонов не помещаются в объектные (.obj) файлы.

(Например, libstdc ++ содержит явное создание экземпляра std :: basic_string , allocator > (то есть std :: string ) поэтому каждый раз, когда вы используете функции std :: string , один и тот же код функции не нужно копировать в объекты. Компилятору нужно только сослаться (связать) их с libstdc ++.)

{ {1}}
49
ответ дан 24 November 2019 в 12:21
поделиться

Если вы определяете шаблонный класс, который вы хотите работать только для пары явных типов.

Поместите объявление шаблона в файл заголовка, как обычный класс.

Поместите определение шаблона в исходный файл, как обычный класс.

Затем в конце исходного файла явно создайте экземпляр только той версии, которую вы хотите сделать доступной.

Глупый пример:

// 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();
}
71
ответ дан 24 November 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: