Maison >développement back-end >C++ >Comment implémenter des surcharges de fonctions membres conditionnelles à l'aide de activate_if en C ?
Sélection d'une fonction membre avec différentes conditions d'activation_if
En C, activate_if est un outil utilisé pour activer ou désactiver conditionnellement certains codes selon que un argument de modèle répond à des critères spécifiques. Cela peut être utile lorsque vous souhaitez personnaliser le comportement d'une classe ou d'une fonction en fonction de ses paramètres de modèle.
Dans l'exemple donné, l'objectif est de créer une fonction membre MyFunction qui se comporte différemment selon que le modèle le paramètre T est un entier ou non. L'implémentation prévue consiste à utiliser deux surcharges de MyFunction, une pour T = int et une pour T != int.
Une approche pour y parvenir consiste à utiliser activate_if, comme indiqué dans le code ci-dessous :
<code class="cpp">template<typename T> struct Point { void MyFunction( typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0) { std::cout << "T is int." << std::endl; } void MyFunction( typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0) { std::cout << "T is not int." << std::endl; } };</code>
Cependant, ce code entraînera des erreurs de compilation dues à une utilisation incorrecte de activate_if. En C , la substitution des arguments du modèle a lieu lors de la résolution de la surcharge. Dans ce cas, aucune substitution ne se produit car le type de T est connu au moment de l'instanciation de la fonction membre.
Pour résoudre ce problème, un paramètre de modèle factice peut être introduit et défini par défaut sur T, permettant SFINAE (L'échec de la substitution n'est pas une erreur) pour fonctionner correctement :
<code class="cpp">template<typename T> struct Point { template<typename U = T> typename std::enable_if<std::is_same<U, int>::value>::type MyFunction() { std::cout << "T is int." << std::endl; } template<typename U = T> typename std::enable_if<std::is_same<U, float>::value>::type MyFunction() { std::cout << "T is not int." << std::endl; } };</code>
Cette approche garantit que la version correcte de MyFunction est sélectionnée en fonction de la valeur de T.
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!