[잡다한코딩] 조건에 따라 enum 값 리턴하는 람다펑션 만들어보기

2016. 12. 11. 01:29엘키스공간/엘키스코딩공방

728x90
728x90

회사에서 코드를 짜다가 간단한 람다 펑션을 쓸 일이 생겼다.

일반적으로 함수냐 매크로냐 자주 고민하게 되는 부분이라고 생각한다.

예제를 즉흥적으로 짜봤다. (실제 회사 게임 코드와는 관계 없습니다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <vector>
#include <string>
 
enum class Arrow : unsigned int { SAME = 0, UP, DOWN };
using UiSomeContentsArrowVec = std::vector<std::pair<std::string, Arrow>>;
void SomeFunc(const int&, UiSomeContentsArrowVec&);
 
void main()
{
    UiSomeContentsArrowVec uiArrowVec;
    uiArrowVec.reserve(3);
 
    unsigned int updatedPoint = 20;
    SomeFunc(updatedPoint, uiArrowVec);
 
    for (auto data : uiArrowVec)
    {
        std::cout << data.first << " = " << static_cast<unsigned int>(data.second) << std::endl;
    }
 
    return;
}
 
void SomeFunc(const int& updatedPoint, UiSomeContentsArrowVec& uiArrowVec)
{
    // get prev point data
    const unsigned int somePoint = 10;
    const unsigned int otherPoint = 20;
    const unsigned int theOtherPoint = 30;
 
    auto someArrow = Arrow::SAME;
    auto otherArrow = Arrow::SAME;
    auto theOtherArrow = Arrow::SAME;
 
    // TODO:
    // compare previous point and updated point
 
    // input data at ui arrow vector
    uiArrowVec.clear();
    uiArrowVec.push_back(std::make_pair("someArrow", someArrow));
    uiArrowVec.push_back(std::make_pair("otherArrow", otherArrow));
    uiArrowVec.push_back(std::make_pair("theOtherArrow", theOtherArrow));
 
    return;
}
cs


업데이트 된 point가 오면 기존 point와 비교하여 ui쪽에 데이터를 세팅하는 건데..


point를 비교하고 enum으로 정의된 Arrow의 값을 각각 변수에 세팅해줘야 한다.

그러러면 일단 한 개의 변수 씩 3항 연산자로 구현할 수 있다.


someArrow = somePoint == updatedPoint ? Arrow::SAME : ( ... )


대충 이런 느낌인데 3개의 point 값을 비교하려면 자연스럽게 함수로 빼게된다.

그러면 저 한 줄을 위해 GetArrow 함수가 생기게 되고

Arrow GetArrow(const unsigned int&, const unsigned int&); 와 같이 정의할 수 있다.

근데 또 외부로 빼야되고 그렇다고 매크로로 정의하기도 애매하므로 람다를 써봤다.


1
2
3
4
5
6
7
8
9
10
    // TODO:
    // compare previous point and updated point
    auto GetArrow = [](const unsigned int& prev, const unsigned int& cur) -> Arrow
    {
        return prev == cur ? Arrow::SAME : (prev > cur ? Arrow::DOWN : Arrow::UP);
    };
    
    someArrow = GetArrow(somePoint, updatedPoint);
    otherArrow = GetArrow(otherPoint, updatedPoint);
    theOtherArrow = GetArrow(theOtherPoint, updatedPoint);
cs


VS2010에선 캡쳐쪽은 [=]를 해주어야 정상적으로 코드가 돌아갔다.

VS2010에선 애초에 enum class도 안 되고 람다 스코프 안에서 enum의 타입을 암묵적으로 추론할 없는 이유인 것 같다.

여튼 C++11 14가 거의 대부분 지원되는 VS2015님은 아주 깔끔하게 돌아간다.

SomeFunc 스코프 안에서 예쁘게 정의되고 사용하기도 편하다.


이런 간단한 함수 객체를 람다로 만드는것부터 좀 더 복잡한 것들도 짜봐야지!

728x90
반응형