Passer des fonctions Lambda avec des variables capturées aux pointeurs de fonction en C
Lorsque vous travaillez avec des fonctions lambda en C, une conversion implicite en pointeurs de fonction peut être une fonctionnalité pratique. Cependant, les lambdas avec des variables capturées posent un défi à cet égard, car ils ne peuvent pas être implicitement convertis.
Pour résoudre ce problème, nous devons comprendre la limitation sous-jacente. Les lambdas de capture conservent une copie des variables auxquelles ils font référence au point de définition. Cet état fermé crée une dépendance à l'égard de la portée, qui ne peut pas être exprimée dans un pointeur de fonction.
La conversion explicite en pointeurs de fonction n'est pas possible en raison des caractéristiques inhérentes des pointeurs. Les pointeurs identifient l'emplacement d'une fonction en mémoire, mais ils ne peuvent pas porter l'état introduit par les variables capturées.
Pour contourner cette limitation, il existe plusieurs approches :
Considérez l'exemple suivant pour illustrer le passage d'un lambda avec des variables capturées comme pointeur de fonction en utilisant l'approche Function Object :
#include <ftw.h> #include <iostream> using namespace std; class Callback { public: void operator()(const char *fpath, const struct stat *sb, int typeflag) { cout << fpath << endl; } }; int main() { vector<string> entries; Callback callback; int ret = ftw("/etc", callback, 1); for (auto entry : entries) { cout << entry << endl; } return ret; }
Dans cet exemple, nous créons une classe Callback qui implémente un appel de fonction Operator() pour imiter le comportement du fonction lambda. Nous pouvons ensuite transmettre une instance de cette classe à la fonction ftw en tant que pointeur de fonction, préservant ainsi efficacement les variables capturées.
En comprenant les limites de la conversion des lambdas de capture en pointeurs de fonction et en utilisant des approches alternatives, les développeurs peuvent utiliser efficacement lambdas dans des contextes où des pointeurs de fonction sont requis.
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!