Явный экземпляр-когда он используется?
после нескольких недель перерыва, я пытаюсь расширить и расширить свои знания шаблонов с книгой Шаблоны – Полное Руководство Дэвидом Вандевордом и Николаем М. Хосуттисом, и то, что я пытаюсь понять в этот момент, - это явное создание шаблонов.
на самом деле у меня нет проблем с механизмом как таковым, но я не могу представить ситуацию, в которой я хотел бы или хочу использовать эту функцию. Если кто-нибудь может объяснить мне, что я буду больше чем благодарен.
3 ответа:
непосредственно скопировано из http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx:
явное создание экземпляра позволяет создать экземпляр шаблонного класса или функции без фактического использования его в коде. Потому что это полезно при создании библиотеки (.lib) файлы, использующие шаблоны для распространения неустановленные определения шаблонов не помещаются в объект (.параметр obj) файлы.
(для экземпляр, libstdc++ содержит явный экземпляр
std::basic_string<char,char_traits<char>,allocator<char> >
(т. е.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(); }
Это зависит от модели компилятора - по-видимому, есть модель Borland и модель CFront. И тогда это зависит также от вашего намерения - если вы пишете библиотеку, вы можете (как указано выше) явно создать экземпляры нужных вам специализаций.
страница GNU c++ обсуждает модели здесь https://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Template-Instantiation.html.