Utilizar funções de Callback em C++
- Declarar Funções de Callback com diferentes notações em C++
-
Utilize
std::map
para armazenar múltiplas funções de Callback com teclas correspondentes em C++ - Chamar a função específica de Callback com base na entrada do utilizador em C++
Este artigo explicará vários métodos de como utilizar as funções de callback em C++.
Declarar Funções de Callback com diferentes notações em C++
Uma chamada de retorno é uma função (ou seja, sub-rotina no código) passada para outras funções como um argumento a ser chamado mais tarde na execução do programa.
As funções de retorno podem ser implementadas utilizando diferentes ferramentas específicas de linguagem, mas em C++, todas elas são conhecidas como objectos chamaveis. Os objectos chamáveis podem ser funções tradicionais, apontadores para as funções, expressões lambda, objectos criados bind
, classes que sobrecarregam ()
operador, e std::function
tipo objectos definidos em <funcional>
cabeçalho.
Abaixo do código de exemplo define duas funções tradicionais addTwoInts
/subtructTwoInts
, uma expressão lambda armazenada na variável modOfTwoInts1
e std::function
type modOfTwoInts2
. Estas funções implementam operadores aritméticos básicos +
, -
e modulo
para números inteiros.
#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;
}
Resultado:
modOfTwoInts1(10, 3) = 1
addTwoInts(10, 3) = 13
subtructTwoInts(10, 3) = 7
modOfTwoInts2(10, 3) = 1
Utilize std::map
para armazenar múltiplas funções de Callback com teclas correspondentes em C++
Uma forma comum de utilizar funções de retorno é armazená-las na estrutura de dados como vector
ou map
, a partir do qual podemos aceder facilmente a cada uma delas e chamar a função específica durante o tempo de execução do programa. Neste caso, escolhemos um contentor map
para armazenar operadores aritméticos como strings para chaves e funções correspondentes como valores. Note-se que este exemplo de código não produz qualquer conteúdo para a consola.
#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;
}
Chamar a função específica de Callback com base na entrada do utilizador em C++
Como consequência da secção anterior, as funções de callback armazenadas no recipiente map
devem ser utilizadas de forma prática. Uma forma de o fazer é pegar no símbolo do operador do utilizador e passá-lo para o recipiente map
como uma chave para chamar o objecto da função correspondente. Este método é frequentemente utilizado para lidar com eventos em aplicações UI. Note-se que estamos a passar a função chamada argumentos inteiros arbitrários (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;
}
Saída (se a entrada for +
):
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