Usar las funciones de devolución de llamada en C++

Jinku Hu 12 octubre 2023
  1. Declarar funciones de devolución de llamada con diferentes notas en C++
  2. Usa std::map para almacenar múltiples funciones de devolución de llamada con las teclas correspondientes en C++
  3. Llamar a la función específica de devolución de llamada basada en la entrada del usuario en C++
Usar las funciones de devolución de llamada en C++

Este artículo explicará varios métodos de cómo utilizar las funciones de devolución de llamada en C++.

Declarar funciones de devolución de llamada con diferentes notas en C++

Una llamada de retorno es una función (es decir, una subrutina en el código) que se pasa a otras funciones como argumento para ser llamada más tarde en la ejecución del programa.

Las funciones callback pueden implementarse utilizando diferentes herramientas específicas del lenguaje, pero en C++, todas ellas se conocen como objetos llamables. Los objetos llamables pueden ser funciones tradicionales, punteros a las funciones, expresiones lambda, objetos creados bind, clases que sobrecargan el () operador, y objetos de tipo std::function definidos en la cabecera <functional>.

A continuación el código de ejemplo define dos funciones tradicionales addTwoInts/subtructTwoInts, una expresión lambda almacenada en la variable modOfTwoInts1 y std::function tipo modOfTwoInts2. Estas funciones implementan los operadores aritméticos básicos +, - y módulo para números enteros.

#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

Usa std::map para almacenar múltiples funciones de devolución de llamada con las teclas correspondientes en C++

Una forma común de usar las funciones de devolución de llamada es almacenarlas en la estructura de datos como vector o map, desde la cual podemos acceder fácilmente a cada una de ellas y llamar a la función específica durante el tiempo de ejecución del programa. En este caso, elegimos un contenedor map para almacenar los operadores aritméticos como cadenas para las teclas y las funciones correspondientes como valores. Tenga en cuenta que este ejemplo de código no tiene ningún contenido en la 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;
}

Llamar a la función específica de devolución de llamada basada en la entrada del usuario en C++

Como consecuencia de la sección anterior, las funciones de devolución de llamada almacenadas en el contenedor map deben ser utilizadas de manera práctica. Una forma de hacerlo es tomar el símbolo de operador del usuario y pasarlo al contenedor map como una clave para llamar al objeto de función correspondiente. Este método se utiliza a menudo para manejar eventos en aplicaciones de interfaz de usuario. Observe que estamos pasando la función llamada argumentos enteros arbitrarios (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;
}

Resultado:

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

Artículo relacionado - C++ Function