显式实例化 – 何时使用?

rest了几个星期后,我试图用David Vandevoorde和Nicolai M. Josuttis的“ 模板 – 完整指南”来扩展和扩展我对模板的了解,现在我想明白的是模板的显式实例化。

我实际上没有这个机制的问题,但我无法想象我想要或想要使用此function的情况。 如果有人能向我解释,我将不胜感激。

直接从http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx复制:;

显式实例化允许您创build模板化类或函数的实例化,而无需在代码中实际使用它。 因为这在创build使用模板进行分发的库(.lib)文件时非常有用 ,所以未将未经实例化的模板定义放入对象(.obj)文件中。

(例如,libstdc ++包含std::basic_string<char,char_traits<char>,allocator<char> > (它是std::string )的显式实例化,所以每次使用std::string的函数时,都会使用相同的函数代码不需要复制到对象,编译器只需要将它们引用(链接)到libstdc ++。)

如果你定义一个模板类,你只想为几个明确的types工作。

把模板声明像普通的类一样放在头文件中。

将模板定义放在源文件中,就像普通的类一样。

然后,在源文件的末尾,显式地仅实例化您想要的版本。

愚蠢的例子:

 // 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(); }