Callback-Funktionen in C++ Verwenden

Jinku Hu 12 Oktober 2023
  1. Deklarieren von Callback-Funktionen mit verschiedenen Notationen in C++
  2. Verwenden von std::map zum Speichern mehrerer Callback-Funktionen mit entsprechenden Schlüsseln in C++
  3. Aufruf der spezifischen Callback-Funktion basierend auf der Benutzereingabe in C++
Callback-Funktionen in C++ Verwenden

In diesem Artikel werden verschiedene Methoden zur Verwendung von Callback-Funktionen in C++ erläutert.

Deklarieren von Callback-Funktionen mit verschiedenen Notationen in C++

Ein Callback ist eine Funktion (d. h. ein Unterprogramm im Code), die an andere Funktionen als Argument übergeben wird, um später in der Programmausführung aufgerufen zu werden.

Callback-Funktionen können mit verschiedenen sprachspezifischen Werkzeugen implementiert werden, aber in C++ werden sie alle als Callable Objects bezeichnet. Aufrufbare Objekte können traditionelle Funktionen, Zeiger auf die Funktionen, Lambda-Ausdrücke, mit bind erzeugte Objekte, Klassen, die den ()-Operator überladen, und Objekte vom Typ std::function sein, die im <functional>-Header definiert sind.

Der folgende Beispielcode definiert zwei traditionelle Funktionen addTwoInts/subtructTwoInts, einen Lambda-Ausdruck, der in der Variablen modOfTwoInts1 gespeichert ist, und den std::function-Typ modOfTwoInts2. Diese Funktionen implementieren grundlegende arithmetische Operatoren +, - und modulo für Ganzzahlen.

#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;
}

Ausgabe:

modOfTwoInts1(10, 3) = 1
addTwoInts(10, 3) = 13
subtructTwoInts(10, 3) = 7
modOfTwoInts2(10, 3) = 1

Verwenden von std::map zum Speichern mehrerer Callback-Funktionen mit entsprechenden Schlüsseln in C++

Eine übliche Art, Callback-Funktionen zu verwenden, besteht darin, sie in einer Datenstruktur wie vector oder map zu speichern, von der aus wir leicht auf jede einzelne von ihnen zugreifen und die spezifische Funktion während der Programmlaufzeit aufrufen können. In diesem Fall haben wir einen map-Container gewählt, um arithmetische Operatoren als Zeichenketten für Schlüssel und entsprechende Funktionen als Werte zu speichern. Beachten Sie, dass in diesem Codebeispiel kein Inhalt auf der Konsole ausgegeben wird.

#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;
}

Aufruf der spezifischen Callback-Funktion basierend auf der Benutzereingabe in C++

Als Konsequenz aus dem vorherigen Abschnitt sollten die im map-Container gespeicherten Callback-Funktionen sinnvoll genutzt werden. Eine Möglichkeit, dies zu tun, besteht darin, das Operator-Symbol vom Benutzer zu nehmen und es als Schlüssel an den map-Container zu übergeben, um das entsprechende Funktionsobjekt aufzurufen. Diese Methode wird oft verwendet, um Ereignisse in UI-Anwendungen zu behandeln. Beachten Sie, dass wir der aufgerufenen Funktion beliebige ganzzahlige Argumente (10, 3) übergeben.

#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;
}

Ausgabe (wenn die Eingabe + ist):

Type one of the following ops
for integers 10 and 3 to be used:
1) + 2) - 3) %
+  
13
Autor: 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

Verwandter Artikel - C++ Function