Usa le funzioni di callback in C++

Jinku Hu 12 ottobre 2023
  1. Dichiarare le funzioni di callback con notazioni diverse in C++
  2. Usa std::map per memorizzare più funzioni di callback con i tasti corrispondenti in C++
  3. Chiamare la funzione di callback specifica basata sull’input dell’utente in C++
Usa le funzioni di callback in C++

Questo articolo spiegherà diversi metodi su come utilizzare le funzioni di callback in C++.

Dichiarare le funzioni di callback con notazioni diverse in C++

Un callback è una funzione (cioè una subroutine nel codice) passata ad altre funzioni come argomento da chiamare in seguito durante l’esecuzione del programma.

Le funzioni di callback possono essere implementate utilizzando diversi strumenti specifici del linguaggio, ma in C++ sono tutti noti come oggetti richiamabili. Gli oggetti richiamabili possono essere funzioni tradizionali, puntatori alle funzioni, espressioni lambda, oggetti creati bind, classi che sovraccaricano l’operatore () e oggetti di tipo std::function definiti nell’intestazione <functional>.

Il codice di esempio sotto definisce due funzioni tradizionali addTwoInts / subtructTwoInts, un’espressione lambda memorizzata nella variabile modOfTwoInts1 e il tipo std::function modOfTwoInts2. Queste funzioni implementano gli operatori aritmetici di base +, - e modulo per i numeri interi.

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

Produzione:

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

Usa std::map per memorizzare più funzioni di callback con i tasti corrispondenti in C++

Un modo comune di utilizzare le funzioni di callback è memorizzarle nella struttura dati come vector o map, da cui possiamo facilmente accedere a ciascuna di esse e chiamare la funzione specifica durante l’esecuzione del programma. In questo caso, abbiamo scelto un contenitore map per memorizzare gli operatori aritmetici come stringhe per le chiavi e le funzioni corrispondenti come valori. Si noti che questo esempio di codice non restituisce alcun contenuto alla 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;
}

Chiamare la funzione di callback specifica basata sull’input dell’utente in C++

Come conseguenza della sezione precedente, le funzioni di callback memorizzate nel contenitore map dovrebbero essere utilizzate in modo pratico. Un modo per farlo è prendere il simbolo dell’operatore dall’utente e passarlo al contenitore map come chiave per chiamare l’oggetto funzione corrispondente. Questo metodo viene spesso utilizzato per gestire gli eventi nelle applicazioni dell’interfaccia utente. Notare che stiamo passando la funzione chiamata argomenti interi arbitrari (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;
}

Uscita (se l’ingresso è +):

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

Articolo correlato - C++ Function