显式实例化 – 何时使用?
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(); }