함수 포인터 + 함수 객체 + 템플릿을 모두 활용한다.

 

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

+ Recent posts