2017-09-26 5 views
0

Disons que nous avons une fonction de modèle:Quand avons-nous besoin d'instancier explicitement une fonction template?

template <class T> T max(T a, T b) { return a > b ? a : b; } 

Étant donné que le compilateur ne fonctionne pas d'une conversion de type implicite lors de la déduction de l'argument de modèle, nous pouvons invoquer max(2, 5.5) dans ces deux façons:

  1. Utilisation de coulée : max(static_cast<float>(2), 5.5f);
  2. Utiliser modèle explicite instanciation: max<float>(2, 5.5);

Deuxième cas est logique pour moi, mais quand est-ce que nous faisons le modèle instanciation explicite dans le ci-dessous manière (instanciation sans invoquer la fonction max avec type char):

template char max(char a, char b); 

Que pouvons-nous atteindre sur il?

+1

instanciation explicite permet de fournir la déclaration sans définition dans d'autres TU. – Jarod42

+0

^- Ce qui est utile si votre modèle ne peut être appliqué qu'à un nombre limité de types, tous connus à l'avance. – StoryTeller

Répondre

1

Si vous écrivez une bibliothèque, les modèles non invoqués par le code de la bibliothèque ne seront pas implémentés, il est donc possible que la bibliothèque manque certaines fonctions que vous avez l'intention de fournir. L'instanciation explicite forcera le compilateur à créer une implémentation pour le modèle spécifié, même si aucun appel n'a été effectué. Lorsque vous liez enfin votre bibliothèque à l'application cliente, l'éditeur de liens trouve l'implémentation pour les types pris en charge par votre bibliothèque.

Peut-être une explication d'un locuteur natif anglais sera plus clair: https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation