Maison > Article > développement back-end > Comment pouvons-nous écrire une fonction générique en C qui accepte les fonctions modèles comme arguments ?
Le défi de définir des fonctions génériques en C peut être rencontré lorsque les fonctions internes sont elles-mêmes génériques . Cet article explore une solution utilisant les paramètres du modèle de modèle pour surmonter cet obstacle.
Considérez l'extrait de code suivant illustrant le problème :
<code class="cpp">template<typename T> void a(T t) { // do something } template<typename T> void b(T t) { // something else } template< ...param... > // ??? void function() { param<SomeType>(someobj); param<AnotherType>(someotherobj); } void test() { function<a>(); function<b>(); }</code>
La difficulté survient lorsqu'il s'agit de déterminer comment définir correctement le modèle de fonction. . Pour résoudre ce problème, nous utilisons une technique connue sous le nom de « paramètres de modèle de modèle ».
Les paramètres de modèle de modèle nous permettent de transmettre des fonctions de modèle comme arguments à d'autres modèles. Cela offre la flexibilité nécessaire pour créer des fonctions génériques qui fonctionnent sur un ensemble spécifique de fonctions de modèle.
Cependant, il y a un problème : nous ne pouvons pas transmettre directement les fonctions de modèle de modèle en tant que types. Au lieu de cela, nous devons utiliser une solution de contournement avec des structures factices.
Le code suivant illustre la solution de contournement :
<code class="cpp">template <typename T> struct a { static void foo (T = T ()) { } }; template <typename T> struct b { static void foo (T = T ()) { } }; struct SomeObj {}; struct SomeOtherObj {}; template <template <typename P> class T> void function () { T<SomeObj>::foo (); T<SomeOtherObj>::foo (); } int main () { function<a>(); function<b>(); }</code>
Les structures factices a et b servent comme espaces réservés pour les fonctions du modèle. Ils fournissent une méthode foo qui ne fait rien, principalement pour satisfaire les exigences de syntaxe.
Le modèle de fonction accepte un paramètre de modèle de modèle T, qui spécifie le type de fonction de modèle à exécuter. Il invoque ensuite foo pour deux types d'objets différents, SomeObj et SomeOtherObj.
En utilisant cette approche, nous pouvons définir des fonctions génériques qui opèrent sur un ensemble de fonctions de modèle de manière flexible et sécurisée.
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!