Spécialisation partielle des fonctions des membres de modèles
En C , il n'est pas possible de spécialiser partiellement les membres individuels d'une classe de modèle. Une spécialisation de modèle doit spécifier tous les paramètres du modèle.
Par exemple, le code suivant n'est pas valide :
<code class="cpp">template <typename T> struct X { void Specialized(); }; template <typename T> // Only specializes for bool type void X<T>::Specialized() { ... } template <typename T> // Only specializes for float type void X<T>::Specialized() { ... }</code>
Solutions de contournement
Il existe plusieurs solutions de contournement pour obtenir le comportement souhaité :
Spécialisation explicite :
Vous pouvez spécialiser explicitement l'ensemble de la classe de modèle pour chaque combinaison souhaitée d'arguments de modèle. Par exemple :
<code class="cpp">template <> void X<int, true>::Specialized() { ... } template <> void X<float, false>::Specialized() { ... }</code>
Fonctions surchargées :
Vous pouvez définir des fonctions surchargées avec le même nom dans la classe de modèle et utiliser des arguments de modèle pour différencier les eux. Par exemple :
<code class="cpp">template <typename T> struct X { void Specialized(bool b) { SpecializedImpl(i2t<b>()); } private: void SpecializedImpl(i2t<true>) { ... } void SpecializedImpl(i2t<false>) { ... } };</code>
En transmettant une valeur booléenne à la fonction surchargée, vous pouvez obtenir une spécialisation partielle pour cette fonction membre spécifique.
Modèles paramétrés :
Vous pouvez définir une classe de modèle distincte pour implémenter le comportement souhaité en fonction des paramètres du modèle. Par exemple :
<code class="cpp">template <typename T, bool B> struct SpecializedImpl { static void call() { ... } }; template <typename T> struct X { void Specialized() { SpecializedImpl<T, B>::call(); } };</code>
Le modèle SpecializedImpl est paramétré à la fois par T et B, vous permettant de le spécialiser en fonction de valeurs spécifiques de ces paramètres.
Le choix La solution de contournement à utiliser dépend des exigences spécifiques du code et des préférences du développeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!