Maison > développement back-end > C++ > Comment les fonctions `std::function` et `std::bind` de C 11 peuvent-elles résoudre des défis de rappel de classe hétérogènes ?

Comment les fonctions `std::function` et `std::bind` de C 11 peuvent-elles résoudre des défis de rappel de classe hétérogènes ?

Mary-Kate Olsen
Libérer: 2024-12-15 22:18:17
original
621 Les gens l'ont consulté

How Can C  11's `std::function` and `std::bind` Solve Heterogeneous Class Callback Challenges?

Transmission de rappels entre classes hétérogènes

En C, définir des rappels qui peuvent être partagés entre différentes classes peut poser un défi. Bien que fournir une fonction membre statique et transmettre un pointeur vers l’instance de classe soit une approche courante, cela limite la flexibilité. Voici comment résoudre ce problème à l'aide des std::function et std::bind:

Refactoring EventHandler

Au lieu de méthodes statiques et de pointeurs d'instance, refactorisez EventHandler pour accepter std::function:

class EventHandler {
public:
    void addHandler(std::function<void(int)> callback) {
        // ... (as above)
    }
};
Copier après la connexion

Cette fonction accepte un "objet fonction" qui prend un argument entier et ne renvoie rien.

Adapter MyClass

Modifier MyClass pour supprimer le mot-clé statique de Callback et fournir un argument à la place :

class MyClass {
public:
    void Callback(int x);
    // ...
};

MyClass::Callback(int x) {
    // ... (as above)
}
Copier après la connexion

Pour lier le Callback au EventHandler, utilisez std::bind:

handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
Copier après la connexion

L'espace réservé _1 représente l'argument unique.

Fonctions autonomes et expressions Lambda

Vous pouvez utiliser des fonctions autonomes directement dans addHandler :

void freeStandingCallback(int x) {
    // ...
}

handler->addHandler(freeStandingCallback);
Copier après la connexion

De plus, les expressions lambda C 11 peuvent être utilisées dans addHandler :

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
Copier après la connexion

Conclusion

En employant std::function et std::bind, les rappels peuvent être transmis de manière transparente entre des classes hétérogènes, offrant flexibilité et réutilisabilité du code.

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