Utiliser les fonctions de rappel en C++
- Déclarer les fonctions de rappel avec différentes notations en C++
-
Utilisez
std::map
pour stocker en C++ plusieurs fonctions de rappel avec les touches correspondantes - Appel de la fonction de rappel spécifique basée sur la saisie de l’utilisateur en C++
Cet article explique plusieurs méthodes d’utilisation des fonctions de rappel en C++.
Déclarer les fonctions de rappel avec différentes notations en C++
Un callback est une fonction (c’est-à-dire une sous-routine dans le code) passée à d’autres fonctions comme argument à appeler plus tard dans l’exécution du programme.
Les fonctions de rappel peuvent être mises en œuvre à l’aide de différents outils spécifiques à un langage, mais en C++, elles sont toutes connues sous le nom d’objets appelables. Les objets appelables peuvent être des fonctions traditionnelles, des pointeurs vers les fonctions, des expressions lambda, des objets créés par bind
, des classes qui surchargent l’opérateur ()
, et des objets de type std::function
définis dans l’en-tête <functional>
.
L’exemple de code ci-dessous définit deux fonctions traditionnelles addTwoInts
/subtructTwoInts
, une expression lambda stockée dans la variable modOfTwoInts1
et std::function
de type modOfTwoInts2
. Ces fonctions implémentent les opérateurs arithmétiques de base +
, -
et modulo
pour les entiers.
#include <functional>
#include <iostream>
#include <map>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::function;
using std::map;
using std::string;
int addTwoInts(int i, int j) { return i + j; }
int subtructTwoInts(int i, int j) { return i - j; }
int main() {
auto modOfTwoInts1 = [](int i, int j) { return i % j; };
cout << "modOfTwoInts1(10, 3) = " << modOfTwoInts1(10, 3) << endl;
cout << "addTwoInts(10, 3) = " << addTwoInts(10, 3) << endl;
cout << "subtructTwoInts(10, 3) = " << subtructTwoInts(10, 3) << endl;
function<int(int, int)> modOfTwoInts2 = [](int i, int j) { return i % j; };
cout << "modOfTwoInts2(10, 3) = " << modOfTwoInts2(10, 3) << endl;
return EXIT_SUCCESS;
}
Production :
modOfTwoInts1(10, 3) = 1
addTwoInts(10, 3) = 13
subtructTwoInts(10, 3) = 7
modOfTwoInts2(10, 3) = 1
Utilisez std::map
pour stocker en C++ plusieurs fonctions de rappel avec les touches correspondantes
Une façon courante d’utiliser les fonctions de rappel est de les stocker dans la structure de données comme vector
ou map
, à partir de laquelle nous pouvons facilement accéder à chacune d’entre elles et appeler la fonction spécifique pendant l’exécution du programme. Dans ce cas, nous avons choisi un conteneur map
pour stocker les opérateurs arithmétiques sous forme de chaînes de caractères pour les clés et les fonctions correspondantes sous forme de valeurs. Notez que cet exemple de code ne produit aucun contenu pour la console.
#include <functional>
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::endl;
using std::function;
using std::map;
using std::string;
int addTwoInts(int i, int j) { return i + j; }
int subtructTwoInts(int i, int j) { return i - j; }
int main() {
auto modOfTwoInts1 = [](int i, int j) { return i % j; };
auto subtruct = subtructTwoInts;
map<string, int (*)(int, int)> op_funcs;
op_funcs.insert({"+", addTwoInts});
op_funcs.insert({"%", modOfTwoInts1});
op_funcs.insert({"-", subtruct});
return EXIT_SUCCESS;
}
Appel de la fonction de rappel spécifique basée sur la saisie de l’utilisateur en C++
En conséquence de la section précédente, les fonctions de rappel stockées dans le conteneur map
doivent être utilisées de manière pratique. Une façon de le faire est de prendre le symbole de l’opérateur de l’utilisateur et de le passer au conteneur map
comme une clé pour appeler l’objet de fonction correspondant. Cette méthode est souvent utilisée pour gérer les événements dans les applications de l’interface utilisateur. Notez que nous passons la fonction appelée arguments entiers arbitraires (10, 3)
.
#include <functional>
#include <iostream>
#include <map>
using std::cin;
using std::cout;
using std::endl;
using std::function;
using std::map;
using std::string;
int addTwoInts(int i, int j) { return i + j; }
int subtructTwoInts(int i, int j) { return i - j; }
int main() {
auto modOfTwoInts1 = [](int i, int j) { return i % j; };
auto subtruct = subtructTwoInts;
map<string, int (*)(int, int)> op_funcs;
op_funcs.insert({"+", addTwoInts});
op_funcs.insert({"%", modOfTwoInts1});
op_funcs.insert({"-", subtruct});
string user_input;
cout << "\nType one of the following ops\n"
"for integers 10 and 3 to be used:\n"
"1) + 2) - 3) % \n";
cin >> user_input;
cout << op_funcs[user_input](10, 3);
return EXIT_SUCCESS;
}
Production (si l’entrée est +
) :
Type one of the following ops
for integers 10 and 3 to be used:
1) + 2) - 3) %
+
13
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook