Exploiter SFINAE pour la vérification conditionnelle
SFINAE (l'échec de la substitution n'est pas une erreur) est une technique puissante de méta-programmation de modèles qui permet compilation conditionnelle basée sur les propriétés de type. Une application particulièrement utile de SFINAE est la possibilité de vérifier les conditions booléennes.
Exemple : Vérification de l'uniformité à l'aide des dimensions d'un tableau
Considérez l'extrait de code suivant :
<code class="cpp">template<int I> void div(char(*)[I % 2 == 0] = 0) { /* this is taken when I is even */ } template<int I> void div(char(*)[I % 2 == 1] = 0) { /* this is taken when I is odd */ }</code>
Dans cet exemple, la fonction div est surchargée en fonction de la dimension du paramètre array. Quand je suis quitte, la première surcharge est utilisée. Sinon, la deuxième surcharge est utilisée. Cela vous permet effectivement de vérifier la parité de I au moment de la compilation.
Vérification des limites des listes d'initialisation
Une autre application utile de SFINAE consiste à vérifier les limites des listes d'initialisation. Par exemple, la structure Vector suivante restreint le nombre d'éléments dans sa liste d'initialisation à l'aide de SFINAE :
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, char(*)[M <<= N] = 0) { /* ... */ } }</code>
La liste d'initialisation n'est acceptée que si le nombre d'éléments M est inférieur ou égal à N. Si M dépasse N, le type non valide char(*)[0] est généré, ce qui oblige SFINAE à supprimer le modèle.
Vous pouvez également exprimer la même condition à l'aide de la macro activate_if de Boost :
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, typename enable_if_c<M <<= N>::type* = 0) { /* ... */ } }</code>
Applications pratiques
En pratique, SFINAE fournit un moyen puissant de vérifier les conditions lors de l'instanciation d'un modèle. Cela permet le développement d'un code flexible et de type sécurisé avec des capacités conditionnelles avancées.
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!