Instanciação explícita – quando é usada?

Após algumas semanas, estou tentando expandir e estender meu conhecimento de modelos com o livro Templates – The Complete Guide de David Vandevoorde e Nicolai M. Josuttis, e o que estou tentando entender neste momento é a instanciação explícita de templates .

Na verdade, não tenho um problema com o mecanismo, mas não consigo imaginar uma situação em que gostaria ou queira usar esse recurso. Se alguém puder explicar isso para mim, serei mais do que grato.

Diretamente copiado de http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx :

A instanciação explícita permite criar uma instanciação de uma class ou function modelada sem realmente usá-la em seu código. Como isso é útil quando você está criando arquivos de biblioteca (.lib) que usam modelos para distribuição, as definições de modelo não instanciadas não são colocadas em arquivos de object (.obj).

(Por exemplo, libstdc ++ contém a instanciação explícita de std::basic_string,allocator > (que é std::string ) assim toda vez que você usa funções de std::string , a mesma function código não precisa ser copiado para objects.O compilador só precisa referir (link) aqueles para libstdc ++.)

Se você definir uma class de modelo que deseja trabalhar apenas para alguns tipos explícitos.

Coloque a declaração do modelo no arquivo de header como uma class normal.

Coloque a definição do modelo em um arquivo de origem como uma class normal.

Em seguida, no final do arquivo de origem, instancie explicitamente somente a versão que você deseja que esteja disponível.

Exemplo bobo:

 // StringAdapter.h template class StringAdapter { public: StringAdapter(T* data); void doAdapterStuff(); private: std::basic_string m_data; }; typedef StringAdapter StrAdapter; typedef StringAdapter WStrAdapter; 

Fonte:

 // StringAdapter.cpp #include "StringAdapter.h" template StringAdapter::StringAdapter(T* data) :m_data(data) {} template void StringAdapter::doAdapterStuff() { /* Manipulate a string */ } // Explicitly instantiate only the classs 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; template class StringAdapter; 

a Principal

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

Depende do modelo do compilador – aparentemente existe o modelo da Borland e o modelo CFront. E então isso depende também da sua intenção – se você está escrevendo uma biblioteca, você pode (como aludido acima) instanciar explicitamente as especializações que você deseja.

A página GNU c ++ discute os modelos aqui https://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Template-Instantiation.html .