함수 포인터
- 함수를 가르키는 포인터
- 특정 함수의 주소를 저장하여 해당 함수를 호출 할 수 있도록 하는 포인터
void Print()
{
cout << "Hello" << endl;
}
int Add(int a, int b)
{
return a + b;
}
int main()
{
using FuncType = void();
FuncType* ptr = &Print;
ptr();
using AddFuncType = int(int, int);
AddFuncType* aptr = &Add;
int result = aptr(10, 20);
using FuncPtrType2 = void(*)();
FuncPtrType2 ptr2 = &Print;
ptr2();
}
using ItemSelectorType = bool(*)(Item* item);
Item* FindItem(Item items[], int itemCount, ItemSelectorType itemSelector)
{
for (int i = 0; i < itemCount; i++)
{
Item* item = &items[i];
if (item->rarity == 1)
{
return item;
}
if (itemSelector)
{
return item;
}
}
return nullptr;
}
bool IsRare(Item* item)
{
return item->rarity == 1;
}
int main()
{
Item items[10];
items[3].rarity = 1;
FindItem(items, 10, IsRare);
}
함수 포인터 주요 활용
- 콜백 함수
- 함수 포인터를 매개변수로 전달하여 특정 작업을 호출하는 방식
- 동적 함수 호출
- 런타임에 호출할 함수를 선택해야 하는 경우 유용하다.
- 함수 배열
- 여러 함수를 배열로 관리하며 필요에 따라 선택하여 호출할 수 있다.
콜백 함수
- 특정 이벤트나 조건이 발생했을 때 호출되도록 설계된 함수
멤버 함수 포인터
class Test
{
public:
void PrintTest() {}
};
int main()
{
using MemFuncPtrType = void(Test::*)();
MemFuncPtrType funcPtr = &Test::PrintTest;
Test t;
(t.*funcPtr)();
}
함수 포인터의 단점
- 시그니처가 안맞으면 사용 불가
- 상태를 가질 수 없음