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