※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
더보기
# 람다와 std::fuction을 사용하고 있지 않는 포스팅
▶ 콜백 함수 (함수포인터, 함수객체, 템플릿을 활용한...)
ㆍ 전화 콜백해줘랑 같은말이다 걍
ㆍ 다시 호출하다, 역으로 호출하다
ㆍ 게임을 만들 때 콜백 개념이 자주 등장한다.
ㆍ 어떤 상황이 일어나면 -> 이 기능을 호출해줘
ex) UI 스킬 버튼을 누르면 -> 스킬을 쓰는 함수 호출
# 함수 포인터
class Item
{
public:
public:
int _itemId = 0;
int _rarity = 0;
int _ownerId = 0;
};
Item* FindItem(Item items[], int itemcnt , bool(*func)(const Item*))
{
for (int i = 0; i < itemcnt; i++)
{
Item* item = &items[i];
//TODO 조건....
return item;
}
return nullptr;
}
ㆍ 원래는 저렇게 함수포인터를 인자로 받아서 아이템을 서칭했었다.
ㆍ 하지만 함수포인터는 인자를 가질 수 없다는 치명적인 단점이 있었다
ㆍ 함수 객체를 이용해 조건을 만들어보자
# 함수 객체
class FindByOwnerId
{
public:
bool operator()(const Item* item)
{
if(item->_itemId == _ownerId)
{
return true;
}
return false;
}
public:
int _ownerId;
};
class FindByRarity
{
public:
bool operator()(const Item* item)
{
if (item->_rarity == _rarity)
{
return true;
}
return false;
}
public:
int _rarity;
};
ㆍ 아이템 아이디를 받는 버전, 레어도를 받는 버전을 만들어봤다.
Item* FindItem(Item items[], int itemcnt, FindByOwnerId selector)
{
for (int i = 0; i < itemcnt; i++)
{
Item* item = &items[i];
if (selector(item))
{
return item;
}
return item;
}
return nullptr;
}
ㆍ 이렇게 selector을 인자로 받아 사용할 수 있겠다... 아니근데 그럼 레어 받는버전, 아이디 받는버전... 등등
ㆍ 사양에 따라 함수를 여러개 만들어야 할까??
# 템플릿 활용
template<typename T>
Item* FindItem(Item items[], int itemcnt, T selector)
{
for (int i = 0; i < itemcnt; i++)
{
Item* item = &items[i];
if (selector(item))
{
return item;
}
return item;
}
return nullptr;
}
ㆍ 공통적인 부분은 FindItem에서 정의하고, 특정 조건(만족조건)만 T를 수정해(콜백 함수로 구현 후 인자 바꾸기)
바꿀 수 있겠다.
int main()
{
Item items[10];
FindByOwnerId func1;
func1._ownerId = 100;
FindByRarity func2;
func2._rarity = 1;
FindItem(items, 10, func1);
FindItem(items, 10, func2);
return 0;
}
ㆍ 기초 개념은 이런거라는 것을 알아두자
'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글
vector와 iterator (1) | 2024.09.28 |
---|---|
vector의 동작 원리(size / capacity) (0) | 2024.09.28 |
클래스 템플릿 (0) | 2024.09.27 |
템플릿 기초 (함수템블릿) (0) | 2024.09.27 |
함수객체 (0) | 2024.09.27 |