Skip to content

Item 5 요약 정리

ozt88 edited this page Mar 9, 2015 · 28 revisions

#Item 5 explicit type <<< auto

###auto의 기본 활용

일반 타입은 초기화 하지 않은 변수를 허용하므로 분명하게 정의되지 않는 경우가 있다.
반면 auto는 초기화 하지 않고서 사용할 수 없다.

   int x1;      //초기화 되지 않은 상태로 작동
   auto x2;     //컴파일 에러
   auto x3 = 0; //x3이 잘 정의된 상태로 작동

타입명이 지나치게 긴 경우 가독성을 해친다.
이 경우 auto를 사용하여 간결하게 표현할 수 있다.
C++14의 경우 람다의 매개 변수 타입에 auto를 사용할 수 있다.

   std::function<bool(const std::unique_ptr<Widget>&,
                      const std::unique_ptr<Widget>&)>
        derefUPLess = [](const std::unique_ptr<Widget>& p1,
                         const std::unique_ptr<Widget>& p2)
                       { return *p1 < *p2; };             //엄청나게 긴 선언
  
   auto derefUPLess = [](const std::unique_ptr<Widget>& p1,
                         const std::unique_ptr<Widget>& p2)
                       { return *p1 < *p2; };             //타입을 auto로 변경 간결한 선언
   
   auto derefUPLess = [](const auto& p1, const auto& p2)
                       { return *p1 < *p2; };           //C++14부터 람다 인자 auto를 활용한 훨씬 간결한 선언

+@ std::function?

일반화된 함수 포인터 템플릿.
함수 포인터와 다르게 모든 callable object들(함수객체, 람다, std::bind...)을 가리킬 수 있다.
함수 signature에 따른 템플릿으로 동작한다. *detail
위의 예제 derefUPLess 람다 함수의 경우

   bool(const std::unique_ptr<Widget>&,
        const std::unique_ptr<Widget>&) //derefUPLess의 signature

   std::function<bool(const std::unique_ptr<Widget>&,
                      const std::unique_ptr<Widget>&)> derefUPLess //템플릿 선언

+@ Closure?

책에서 함수를 가리킬때 계속되서 언급되는 개념 [wiki](http://en.wikipedia.org/wiki/Closure_(computer_programming) blog
1줄 요약하자면 상태를 갖고 있는 함수 객체, capture를 포함한 람다도 일종의 closure

void Closure()
{
  int state = 5;
  
  // state 값을 pass by value로 capture 하였다.
  // 람다식을 auto f 변수에 대입하였다.
  auto f = [state](int param)
  {
    auto result = state + param;
    std::cout << result << std::endl;
  };
  // f는 closure
  // 람다식 실행.
  f(10);
}

auto 와 std::function의 차이점