Les lambdas en C++ et le passage de contexte aux callbacks en C
Dans cette leçon, vous allez utiliser les lambdas du C++ pour emporter des données locales dans un callback, puis comparer avec le passage de contexte par pointeur void en C.
Introduction
Une lambda crée une fonction anonyme directement sur place et peut "capturer" (capture) les variables locales environnantes pour les utiliser à l'intérieur. En C, un callback ne peut pas emporter de données tout seul, le contexte doit donc être transmis explicitement, généralement par un pointeur void.
Points importants
- Comprenez comment on fait en C avant d'apprendre les abstractions du C++.
- Exprimez la possession des ressources avec RAII et la sémantique de valeur (value semantics).
- Préférez les outils sûrs du point de vue des types du C++ aux macros et aux conversions de type.
Exemples de code C et C++
#include <stdio.h>
int above(int value, void *context) {
return value > *(int *)context;
}
int main(void) {
int values[] = {2, 7, 4, 9};
int threshold = 5;
int count = 0;
for (int index = 0; index < 4; ++index) {
count += above(values[index], &threshold);
}
printf("%d\n", count);
}
2
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector values{2, 7, 4, 9};
int threshold = 5;
auto above = [threshold](int value) {
return value > threshold;
};
std::cout << std::count_if(values.begin(), values.end(), above)
<< '\n';
}
2
Comparaison entre C et C++
La fonction above en C reçoit le seuil par le paramètre void *context et doit le convertir en int * avant de comparer. En C++, la lambda capture la variable threshold par valeur, elle conserve donc l'information de type sans conversion manuelle. Les deux programmes comptent 2 valeurs supérieures à 5.
C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.
C++ offre des abstractions à la portée bien délimitée, sûres pour les types et généralement sans coût supplémentaire à l'exécution.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Écrivez d'abord le mécanisme en C, puis utilisez la fonctionnalité équivalente du C++.
- Remplacez la libération manuelle des ressources par RAII.
- Vérifiez si la fonctionnalité provoque des allocations mémoire ou des appels de fonctions virtuelles.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
Tous les défis