🙇‍♀️lamda


🪐lamda

#include <iostream>
using namespace std;
#include <vector>


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

enum class Rarity
{
	Common,
	Rare,
	Unique
};

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

	}

public:
	int _itemId = 0;
	Rarity _rarity = Rarity::Common;
	ItemType _itemType = 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::Jewelly));
	v.push_back(Item(4, Rarity::Unique, ItemType::Weapon));


	{
		struct IsUniqueItem
		{
			bool operator()(Item& item)
			{
				return item._rarity == Rarity::Unique;
			}
		};

		// 클로저 (closure) = 람다에 의해 만들어진 실행시점 객체
		//[](Item& item) { return item._rarity == Rarity::Unique; }; // 람다 표현식 (lamda expression)

		auto findIt = std::find_if(v.begin(), v.end(), /*IsUniqueItem()*/ [](Item& item) { return item._rarity == Rarity::Unique; });
		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._itemType == _type;
			}

			int _itemId;
			Rarity _rarity;
			ItemType _type;

		};

		int itemId = 4;
		Rarity rarity = Rarity::Unique;
		ItemType type = ItemType::Weapon;

		// [ ] 캡처(capture) : 함수 객체 내부에 변수를 저장하는 개념과 유사
		// 사진을 찰칵하듯.. 일종의 스냅샷
		// 기본 갭처 모드 : 값(복사) 방식(=) 참조 방식(&)진퉁사용
		// 변수마다 캡처 모드를 지정해서 사용 가능 : 값 방식(name), 참조 방식(&name)

		// [=], [&]은 최대한 지양하는 것이 좋음, 어떤 애들이 캡처가 된건지 가시적 확인이 힘듦

		// [&itemId, rarity, type] 처럼 각각의 캡처모드 지정
		// [=, &type]


		auto findByItem = [&itemId, rarity, type](Item& item) { return item._itemId == itemId && item._rarity == rarity && item._itemType == type; };

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

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


	return 0;
}

태그:

카테고리:

업데이트: