enum class ItemType
{
    // ...
};
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));
    {
        struct IsUniqueItem
        {
            bool operator()(Item& item)
            {
                return item._rariry == Rarity::Unique;
            }
        };
        auto findIt = std::find_if(v.begin(), v.end(), IsUniqueItem()/* Functor로 사용해도 된다 */);
        if(findIt != v.end())
            cout << "findIt->_itemId" << endl;
        // 조건마다 매번 functor를 만들어 줘야할까?
        // 람다를 써보자.
    }
    {
        auto isUniqueLambda = [](Item& item) { return item._rariry == Rarity::Unique; }   // 반환형식은 컴파일러가 알아서 처리해준다.
        auto findIt = std::find_if(v.begin(), v.end(), isUniqueLambda);
        if(findIt != v.end())
            cout << "findIt->_itemId" << endl;
        // isUniqueLambda : 클로저(closure)람다에 의해 만들어진 실행시점 객체
    }
}
// 이건 될까?
struct FindItemByItemId
{
    FindItemByItemId(int itemId) : _itemId(itemId)
    {
    }
    bool operator()(Item& item)
    {
        return item._itemId == _itemId;
    }
    // 내부 변수를 갖고있고 그 변수를 이용
    int _itemId;
};
// 이걸람다로 표현하려면?
int itemId = 4;
auto findByItemIdLambda = [=](Item& item) { return item._itemId == itemId; };
// 물론 참조할 변수를 직접 지정가능
auto findByItemIdLambda = [itemId](Item& item) { return item._itemId == itemId; };
auto findByItemIdLambda = [&itemId](Item& item) { return item._itemId == itemId; };