STL 알고리즘에 데이터를 전달하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.
- 함수 포인터
- 함수 객체
- 람다 표현식
- 많은 STL 알고리즘이 데이터를 처리하기 위해 매개변수로 함수 객체(function object)를 받아들입니다. * 펑크터(functor)라고도 불리는 함수 객체는 호출 연산자(())와 함께 사용할 수 있는 객체를 의미합니다.
- 이러한 함수 객체는 우선 타입을 선언하고, 해당 클래스에서 호출 연산자(())를 오버로딩하여 구현하게 됩니다.
함수 포인터
- 함수를 저장하는 포인터
- 함수 포인터를 주고 받거나, 함수 포인터로 함수를 호출 할 수 있다.
void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 선언
//↓ 반환값 자료형
void (*fp)(); // 반환값과 매개변수가 없는 함수 포인터 fp 정의
// ↑ ↖ 매개변수가 없음
// 함수 포인터 이름
int (*fp)(int, int); // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
//↓ 반환값 자료형
int (*fp)(int, int); // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
// ↑ ↖ int형 매개변수 두 개
// 함수 포인터 이름
typedef int(*Funcptr)(int, int);
int(*Fptr)(int, int);
int calcultor(int first, int second, Funcptr func)
{
return func(first, second);
}
int add(int a, int b){ return a + b;}
int minus(int a, int b){ return a - b;}
Funcptr SelectFunc(const int& iSelect)
{
Funcptr calc = 0;
//static Funcptr calc = 0; //전역으로 하면, 반환유형을 Funcptr& 할수가 있고, 매번 생성 안됨
switch (iSelect)
{
case 0:
{
calc = add;
break;
}
case 1:
{
calc = minus;
}
default:
break;
}
return calc;
}
void hello(){
std::cout << "hello" << std::endl;
}
int main()
{
void (*B)();
B = hello;
B();
int iValue1 = 11;
int iValue2 = 2;
int (*C)(int, int);
C = add;
std::cout << C(iValue1, iValue2) << std::endl;
///////////////////////////////////////////////////////////
Funcptr D = SelectFunc(0);
std::cout << D(iValue1, iValue2) << std::endl; //13
Funcptr E = SelectFunc(1);
std::cout << E(iValue1, iValue2) << std::endl; //9
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
return 0;
}
}
'프로그래밍 > C++' 카테고리의 다른 글
함수 객체 (0) | 2019.04.29 |
---|---|
이동 시멘틱 (0) | 2019.04.29 |
스마트포인터 (0) | 2019.04.29 |
템플릿 <template> (0) | 2019.04.29 |
OOP 객체지향프로그래밍 (0) | 2019.04.29 |