오늘의논리 2023. 3. 6. 22:34
728x90

함수 객체를 빠르게 만드는 문법

 

  • [  ] 캡쳐(capture) : 함수 객체 내부에 변수를 저장하는 개념과 유사
  • 사진을 찰칵 캡쳐 하듯.. 일종의 스냅샷을 찍는다고 이해
  • 기본 캡쳐모드: 값(복사)방식(=), 참조방식(&)
  • 참조방식은 직접 해당값의 주소에 들어가 값을 본다
  • 변수마다 캡처 모드를 지정해서 사용도 가능 : 값 방식(name), 참조방식(&name)<추천!>
  • 모두 복사, 모두 참조방식 지양
  • 매번 클래스, 함수포인터 이런걸 안만들어도 되는 장점이 있음

 

[캡쳐](인자값) {구현부} 구조

 

아이템을 찾는 기능을 만든다고 했을때 람다 문법을 이용해서찾아보자

using namespace std;

enum class ItemType
{
	None,
	Armor,
	Jewelry,
	Weapon,
	Consumable
};

enum class Rarity
{
	Common,
	Rare,
	Unique,
};

class Item
{
public:
	Item() {}
	Item(int itemId, Rarity rarity, ItemType type)
		:_itemId(itemId), _rarity(rarity), _type(type)
	{

	}

public:
	int _itemId = 0;
	Rarity _rarity = Rarity::Common;
	ItemType _type = ItemType::None;


};


int main()
{
	vector<Item> v;
	v.push_back(Item(1, Rarity::Common, ItemType::Weapon));
	v.push_back(Item(2, Rarity::Common, ItemType::Armor));
	v.push_back(Item(3, Rarity::Rare, ItemType::Jewelry));
	v.push_back(Item(4, Rarity::Unique, ItemType::Weapon));

	//람다 = 함수 객체를 쉽게 만드는 문법
	//람다 자체로 C++11문법에 '새로운'기능이 들어간 것은 아니다
	{
		//클로저(closure) = 람다에 의해 만들어진 실행시점 객체
		auto isUniqueLamda = [](Item& item)->int // (람다 표현식)
		{
			return item._rarity == Rarity::Unique; 
		}; 

		auto findIt = std::find_if(v.begin(), v.end(), isUniqueLamda);
		if (findIt != v.end())
			cout << "아이템 ID : " << findIt->_itemId << endl;
			
	}

	{
		struct FindItem
		{
			FindItem(int itemId, Rarity rarity, ItemType type)
				: _itemId(itemId), _rarity(rarity), _type(type)
			{
			}
			bool operator()(Item& item)
			{
				return item._itemId == _itemId && item._rarity == _rarity && item._type == _type;
			}

			int _itemId;
			Rarity _rarity;
			ItemType _type;
		};


		int itemId = 3;
		Rarity rarity = Rarity::Rare;
		ItemType type = ItemType::Jewelry;

		auto findByItemLamda =[&itemId, rarity, type](Item& item) // 또는 [ ]안에 [=, &type] 도 가능
		{ 
			return item._itemId == itemId && item._rarity == rarity && item._type == type;
		};

		//auto findIt = std::find_if(v.begin(), v.end(), FindItem(itemId, Rarity::Unique, ItemType::Weapon));

		auto findIt = std::find_if(v.begin(), v.end(), findByItemLamda);


		if (findIt != v.end())
			cout << "아이템 ID : " << findIt->_itemId << endl;

	}

	return 0;
}
728x90