Usa le funzioni di callback in C++
- Dichiarare le funzioni di callback con notazioni diverse in C++
-
Usa
std::map
per memorizzare più funzioni di callback con i tasti corrispondenti in C++ - Chiamare la funzione di callback specifica basata sull’input dell’utente 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
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