Maison > développement back-end > C++ > Comment puis-je transmettre des fonctions C Lambda avec des variables capturées aux pointeurs de fonction ?

Comment puis-je transmettre des fonctions C Lambda avec des variables capturées aux pointeurs de fonction ?

Susan Sarandon
Libérer: 2024-12-14 10:48:15
original
207 Les gens l'ont consulté

How Can I Pass C   Lambda Functions with Captured Variables to Function Pointers?

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 :

  1. Créer un Objet de fonction : Définissez un objet fonction de type classe avec une surcharge Operator() qui encapsule les variables et la logique capturées. Cet objet fonction peut ensuite être utilisé comme pointeur de fonction. Cependant, cette approche sacrifie potentiellement une partie de la syntaxe lambda concise.
  2. Passer en tant qu'objet de fonction : Transmettez la fonction lambda en tant qu'objet de fonction au lieu d'un pointeur de fonction. Par exemple, la classe std::function, const stat, int)> peut contenir des lambdas et être utilisé comme substitut de pointeur de fonction.
  3. Variables externes de référence : Utilisez des variables globales ou statiques qui peuvent être référencées par la fonction lambda. Cette approche permet la communication entre le lambda et la portée externe mais peut introduire des dépendances d'état globales et des problèmes de concurrence potentiels.

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal