Modèle de spécialisation en C ++

Certains modèles ne vont pas ensemble tout à fait aussi facilement que vous pourriez vous attendre parce qu'ils expriment un concept qui ne se traduit pas de la même manière pour chaque type de données. Par exemple, lorsque vous utilisez stringify pour transformer un type de données dans sa représentation de chaîne, la technique diffère en fonction du type de données. Par exemple, lorsque vous voulez utiliser stringify sur un int, vous pouvez utiliser le modèle suivant:

#comprendre #comprendre using namespace std-modèle chaîne de ligne de (const T input) {ostringstream sortie-sortie lt; lt; entrée-retour output.str () -} int main () {// Cet appel fonctionne comme expected.cout lt; lt; stringify(42) lt; lt; endl - // Cet appel truncates.cout lt; lt; stringify(45,6789012345) lt; lt; endl-retour 0-}

La stringify () fonction accepte tout type de données et utilise simplement une ostringstream convertir contribution à un chaîne. Cette approche fonctionne très bien pour le premier appel de main (), qui est un int. Toutefois, lorsque le code utilise pour cela un double, le résultat est tronqué comme montré ici:

4245.6789



Vous pouvez résoudre ce problème en ajoutant un traitement spécial pour un double. Voici la forme modifiée de l'exemple (comme le montre StringifyDouble) Qui loge un double.

#comprendre #comprendre #comprendre #comprendre using namespace std-modèle chaîne de ligne de (const T input) {ostringstream sortie-sortie lt; lt; entrée-retour output.str () -} modèle lt;> string en ligne stringify (Double const entrée) {ostringstream sortie const int sigdigits = numeric_limits:: digits10-sortie lt; lt; SetPrecision (sigdigits) lt; lt; entrée-retour output.str () -} int main () {cout lt; lt; stringify(42) lt; lt; endl-cout lt; lt; stringify(45,6789012345) lt; lt; endl-retour 0-}

Lorsque vous exécutez cet exemple, vous voyez le résultat attendu parce que la double forme des utilisations de modèle SetPrecision à modifier la ostringstream valeur. En conséquence, vous voyez la sortie suivante:

4245,6789012345

Comme les choses sont assis avec C ++ aujourd'hui, vous devez créer un modèle spécial pour chaque type de données qui l'exige. Théoriquement, si C ++ obtient jamais une Type de() fonction, vous pouvez détecter le type de données et ajouter une interrupteur pour effectuer un traitement spécialisé dans un seul modèle.

La typeid () fonction pourrait travailler comme un substitut pour Type de(), mais il est spécifique au fournisseur et non mis en œuvre dans chaque version de C ++. Si vous choisissez d'utiliser le typeid () fonction, assurez-vous que vous savez quel compilateur votre organisation va utiliser pour compiler le code de l'application.

Vous avez peut-être également remarqué la en ligne mot-clé utilisé pour le modèle dans cet exemple. La en ligne mot-clé indique au compilateur de placer le code créé par le modèle en ligne avec le code dans lequel il apparaît, plutôt que sur la ligne comme un appel de fonction distincte. Dans certains cas, comme celui- stringify () fonction, le résultat est le code qui exécute plus rapidement.

Le compilateur est sous aucune obligation de se conformer à la en ligne mot-clé. En outre, vous voulez le code du modèle mis hors ligne quand il doit effectuer un certain niveau d'instanciation ou il ne représente pas le code du chemin critique que l'application peut appeler souvent.


» » » » Modèle de spécialisation en C ++