Utiliser les fonctions de rappel en C++

Jinku Hu 12 octobre 2023
  1. Déclarer les fonctions de rappel avec différentes notations en C++
  2. Utilisez std::map pour stocker en C++ plusieurs fonctions de rappel avec les touches correspondantes
  3. Appel de la fonction de rappel spécifique basée sur la saisie de l’utilisateur en C++
Utiliser les fonctions de rappel 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
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ Function