[STL] 함수 포인터 - 콜백 함수

콜백 함수
일반적으로 클라이언트가 서버 코드를 호출하는데 이를 콜(Call)이라 하고,
서버가 클라이언트를 호출하면 콜백(Callback)이라 한다.
STL의 많은 알고리즘도 콜백을 이용해 클라이언트 정책을 반영한다.
윈도의 모든 프로시저는 시스템이 호출하는 "콜백 함수"이다.

 

함수 포인터를 활용한 콜백 메커니즘 코드 
#include <iostream>
using namespace std;

///배열의 모든 원소에 반복적인 작업을 수행하게 추상화
void For_each(int* begin, int* end, void(*pf)(int)) {
	while (begin != end) {
		pf(*begin++);
	}
}

void Print1(int n) {
	cout << n << ' ';
}

void Print2(int n) {
	cout << n * n << " ";
}

void Print3(int n) {
	cout << "정수 : " << n << endl;
}

int main() {
	int arr[5] = { 10, 20, 30, 40, 50 };

	For_each(arr, arr+5, Print1);
	cout << endl;
	For_each(arr, arr + 5, Print2);
	cout << endl;
	For_each(arr, arr + 5, Print3);

	return 0;
}

 

For_each함수가 Print1, 2, 3을 호출하는 콜백 메커니즘입니다.

Main에서는 For_each에 배열 arr의 시작주소와 +5인 배열의 마지막 뒤 주소를 전달함으서 For_each 함수 내 while문에선 시작주소가 끝주소 이후가 될때까지 반복하도록 되어있습니다.

매개변수를 각 Print함수들의 반환값과 매개변수와 맞추기 위해 void(*pf)(int)로 선언하여 pf(*begin++)로 받아온 함수를 호출합니다.

 

결과


STL 알고리즘 라이브러리의 for_each함수 사용
위에서는 For_each함수를 임의로 작성하여 호출했지만 이번엔 algorithm 라이브러리의 for_each함수를 직접 호출했습니다.
#include <iostream>
#include <algorithm>
using namespace std;

void Print1(int n) {
	cout << n << ' ';
}

void Print2(int n) {
	cout << n * n << " ";
}

void Print3(int n) {
	cout << "정수 : " << n << endl;
}

int main() {
	int arr[5] = { 10, 20, 30, 40, 50 };

	for_each(arr, arr+5, Print1);
	cout << endl;
	for_each(arr, arr + 5, Print2);
	cout << endl;
	for_each(arr, arr + 5, Print3);

	return 0;
}
결과

 

 

결과가 똑같이 나온것을 확인할 수 있었습니다.

 

이로써 algorithm라이브러리의 for_each함수도 콜백 메커니즘으로 되어 있다는 것을 확인 할 수 있습니다.

'C++ > STL' 카테고리의 다른 글

[STL] 함수 템플릿  (0) 2025.02.21
[STL] 함수 객체  (0) 2025.02.20
[STL] 함수포인터 - 멤버 함수 호출  (0) 2025.02.15
[STL]함수 포인터 - 정적 함수 호출  (0) 2025.02.15
[STL] 함수 포인터의 종류  (0) 2025.02.15