클로져 사용하기 1
그럼 이제 클러져에 대해서 알아 보겠습니다.
람다를 사용할 때 람다 식 외부에 정의되어 있는 변수를 람다 식 내에서 사용한 후 결과를 그 변수에 그대로 저장하고 싶을 때가 있습니다. 이럴 때 클로져를 사용하면 됩니다.
클로져는 참조나 복사로 전달이 가능합니다. 참조를 사용하는 경우는 &을 사용하면 됩니다.
람다 표현의
에서 앞의 ‘[]’ 사이에 클로져할 변수를 기술하면 됩니다.
< Code 4. >
int main()
{
vector< int > Moneys;
Moneys.push_back( 100 );
Moneys.push_back( 4000 );
Moneys.push_back( 50 );
Moneys.push_back( 7 );
int TotalMoney1 = 0;
for_each(Moneys.begin(),
Moneys.end(), [&TotalMoney1](int Money) {
TotalMoney1 += Money;
});
cout << "Total Money 1
: "
<< TotalMoney1 << endl;
return 0;
}
< 결과 >
람다 식이 외부에 있는 TotalMoney1 변수를 참조로 캡쳐(capture)(람다 식의 외부에 있는 것을 사용할 때 캡쳐한다고 합니다) 하여 Moneys 벡터에
있는 값을 모두 더하고 있습니다.
그럼 TotalMoney1 변수를 값으로 전달하면 어떻게
될까요?
for_each(Moneys.begin(), Moneys.end(), [TotalMoney1](int Money) {
TotalMoney1 += Money;
});
이렇게 하면 아래와 같은 컴파일 에러가 발생합니다.
그럼 포인터 전달은 어떨까요?
< Code 5. >
………….
int TotalMoney2 = 0;
int* pTotalMoney2 =
&TotalMoney2;
for_each(Moneys.begin(), Moneys.end(), [pTotalMoney2](int Money) {
*pTotalMoney2 += Money;
});
cout << "Total Money 2 : " << TotalMoney2 << endl;
………..
< 결과 >
당연히 잘 됩니다.^^
클로져에 대한 이야기가 끝난 것은 아닙니다. 다음 회에 나머지 이야기를 다 할테니 기다려 주세요 ~
'C++0x' 카테고리의 다른 글
| [VC++] 14. decltype (0) | 2009/06/30 |
|---|---|
| [VC++] 13. Lambda - 네 번째 (3) | 2009/06/23 |
| [VC++] 12. Lambda - 세 번째 (0) | 2009/06/16 |
| [VC++] 11. Lambda - 두 번째 (0) | 2009/06/09 |
| [VC++] 9. Lambda ( 람다 ) - 첫 번째 (4) | 2009/06/02 |
| [VC++] 8. 우측 값 참조( RValue Reference ) – 다섯 번째 (3) | 2009/05/26 |




댓글을 달아 주세요