C++에서 콜백 함수 사용 만들기

Jinku Hu 2023년10월12일
  1. C++에서 다른 표기법으로 콜백 함수 선언
  2. std::map을 사용하여 C++에서 해당 키와 함께 여러 콜백 함수 저장
  3. C++의 사용자 입력을 기반으로 특정 콜백 함수 호출
C++에서 콜백 함수 사용 만들기

이 기사에서는 C++에서 콜백 함수를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

C++에서 다른 표기법으로 콜백 함수 선언

콜백은 나중에 프로그램 실행에서 호출 할 인수로 다른 함수에 전달되는 함수 (즉, 코드의 서브 루틴)입니다.

콜백 함수는 다른 언어 별 도구를 사용하여 구현할 수 있지만 C++에서는 모두 호출 가능한 객체로 알려져 있습니다. 호출 가능한 객체는 기존 함수, 함수에 대한 포인터, 람다 표현식, 생성 된bind 객체,()연산자를 오버로드하는 클래스,<functional>헤더에 정의 된std::function 유형 객체 일 수 있습니다.

아래 예제 코드는 두 개의 전통적인 함수addTwoInts/subtructTwoInts,modOfTwoInts1 변수 및std::function 유형modOfTwoInts2에 저장된 하나의 람다 표현식을 정의합니다. 이 함수는 정수에 대한 기본 산술 연산자+,- 및 모듈로를 구현합니다.

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

출력:

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

std::map을 사용하여 C++에서 해당 키와 함께 여러 콜백 함수 저장

콜백 함수를 사용하는 일반적인 방법은vector 또는map과 같은 데이터 구조에 저장하는 것입니다. 여기서 우리는 이들 각각에 쉽게 액세스하고 프로그램 실행 중에 특정 함수를 호출 할 수 있습니다. 이 경우 산술 연산자를 키 문자열로 저장하고 해당 함수를 값으로 저장하기 위해map 컨테이너를 선택했습니다. 이 코드 예제는 콘솔에 콘텐츠를 출력하지 않습니다.

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

C++의 사용자 입력을 기반으로 특정 콜백 함수 호출

이전 섹션의 결과로map 컨테이너에 저장된 콜백 함수는 실용적인 방식으로 활용되어야합니다. 이를 수행하는 한 가지 방법은 사용자로부터 연산자 기호를 가져 와서 해당 함수 객체를 호출하기위한 키로map 컨테이너에 전달하는 것입니다. 이 메서드는 UI 응용 프로그램에서 이벤트를 처리하는 데 자주 사용됩니다. 임의의 정수 인수(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;
}

출력 (입력이 ‘+‘인 경우) :

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

관련 문장 - C++ Function