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
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