-
Notifications
You must be signed in to change notification settings - Fork 0
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를 활용한 훨씬 간결한 선언
일반화된 함수 포인터 템플릿.
함수 포인터와 다르게 모든 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 //템플릿 선언
책에서 함수를 가리킬때 계속되서 언급되는 개념
[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);
}