#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;
}