프로그래밍/Modern c++
lamda 람다
오늘의논리
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