(Modern C++) lambda

Posted by : at

Category : Cpp


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

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links