함수 포인터 + 함수 객체 + 템플릿을 모두 활용한다.
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;
};
Item* FindItem(Item items[], int itemCount, FindByOwnerId selector) // 확장성이 떨어짐
{
for (int i = 0; i < itemCount; i++)
{
Item* item = &items[i];
if (selector(item)) return item;
}
return nullptr;
}
위와같은 경우 FindItem의 세번째 인자로 함수 객체를 넘겨주는데, 같은 형식의 함수 객체를 커버하지 못해서 확장성이 떨어진다.
그렇다고 부모 클래스를 만들어서 업캐스팅을 하는 것 보다는 템플릿을 이용하면 더 깔끔하게 처리가 된다.
template<typename T>
Item* FindItem(Item items[], int itemCount, T selector)
{
for (int i = 0; i < itemCount; i++)
{
Item* item = &items[i];
if (selector(item)) return item;
}
return nullptr;
}
'C++ > Rookiss C++' 카테고리의 다른 글
[STL] list (0) | 2022.08.31 |
---|---|
[STL] vector (0) | 2022.08.30 |
[콜백 함수] 템플릿 기초 (0) | 2022.08.30 |
[콜백 함수] 함수 객체 (0) | 2022.08.30 |
[콜백 함수] 함수 포인터 (0) | 2022.08.30 |