#include<iostream>
using namespace std;
// 주제 : 콜백 (CallBack)
class Item // 아이템 클래스
{
public:
public:
int _itemId = 0; // 아이템 아이디
int _rarity = 0; // 희귀도
int _ownerId = 0; // 주인 아이디
};
class FindByOwnerId
{
public:
bool operator()(const Item* item) // 함수 객체를 만들기 위한 오버로딩, 매개변수는 복사가 아니라 진퉁 작업을 위한 포인터
{
return (item->_ownerId == _ownerId); // 아이템의 주인 아이디가 멤버변수 주인 아이디와 비교
}
public:
int _ownerId; // 주인 아이디
};
class FindByRarity
{
public:
bool operator()(const Item* item)
{
return (item->_rarity >= _rarity);
}
public:
int _rarity;
};
template<typename T>
Item* FindItem(Item items[], int itemCount, T selector) // 아이템을 배열로 (곧 포인터), 아이템의 개수, seletor란 콜백함수
{
for (int i = 0; i < itemCount; i++) // 아이템의 개수만큼 반복
{
Item* item = &items[i]; // 각 인덱스에 해당하는 아이템의 주소값을 저장
if (selector(item)) // selector로 확인 후 리턴
return item;
}
return nullptr;
}
int main()
{
// 함수 포인터 + 함수 객체 + 템플릿
// 콜백 (CallBack) : 다시 호출하다? 역으로 호출하다?
// 어떤 상황이 일어나면 -> 이 기능을 호출해줘
// 스킬 버튼을 누르면 -> 스킬 함수 호출
Item items[10];
items[3]._ownerId = 100;
items[8]._rarity = 2;
FindByOwnerId functor1;
functor1._ownerId = 100;
FindByRarity functor2;
functor2._rarity = 1;
Item* item1 = FindItem(items, 10, functor1);
Item* item2 = FindItem(items, 10, functor2);
return 0;
}