Fonction de modèle comme argument de modèle
En C, la programmation générique peut être réalisée via des pointeurs de fonction ou des modèles. Bien que les modèles garantissent les appels de fonctions en ligne, ils sont confrontés à des limites lorsqu'ils traitent eux-mêmes des fonctions génériques.
Énoncé du problème
Considérez le code suivant :
<code class="cpp">void a(int) { // do something } void b(int) { // something else } template<void (*param)(int) > void function() { param(123); param(456); }</code>
Bien que cette fonction de modèle simplifie la répétition entre fonction1 et fonction2, cela devient problématique lorsque a et b sont eux-mêmes génériques :
<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); }</code>
Solution : Paramètres du modèle de modèle
Pour définir la fonction générique avec les fonctions génériques a et b, nous devons utiliser des paramètres de modèle de modèle. Cependant, passer ces fonctions directement sous forme de types n’est pas possible. Par conséquent, nous utilisons une solution de contournement avec des structures factices :
<code class="cpp">template<typename T> struct a { static void foo(T = T()) {} }; template<typename T> struct b { static void foo(T = T()) {} }; template<template<typename P> class T> void function() { T<SomeObj>::foo(); T<SomeOtherObj>::foo(); }</code>
En spécifiant le paramètre de modèle de modèle comme structures factices a et b, nous pouvons instancier la fonction modèle et appeler les méthodes foo génériques dans la fonction.
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!