목차

포인터 배열 자동 삭제 (auto_ptr 흉내)

std::vector<BYTE> vector(cbType);
pType = (WM_MEDIA_TYPE*)&vector[0];

__event

2015 부터는 삭제될 예정이니 쓰지 말라고 경고를 띄운다.

전에 쓰던 방법처럼

람다

이름이 필요 없는 즉석 함수. C++ 언어는 c#과는 좀 다르게 구성되어 있다.

{
  []  // 람다 시작 (캡쳐)
  ()  // 파라미터 정의 창
  {}  // 함수 본체
  (); // 함수 호출. 호출하는 경우.
 
  // 예2 : 바로 실행
  auto fn1 = []() { /* 어쩌구 저쩌구 */ }();
 
  // 예2 : 선언만 해서 넘기는 경우
  auto fn2 = []() { /* 어쩌구 저쩌구 */ };
}

파라미터가 있는 경우

auto _fn = []( int n ) { std::cout << "Num: " << n << std::endl; };
_fn( 100 );
_fn( 200 );

리턴 값에 대한 설정의 경우

// 알아서 설정 되도록
auto tfn1 = []() { return 3.14f; };
auto tfn2 = []( float _f ) { return f; }; 
// 확실히 지정한다.
auto tfn2 = []( float _f ) -> float { return f; }; 

캡처

람다 함수 외부의 변수를 람다 함수에서 사용하고 싶은 경우, 그 변수를 캡쳐Capture하면 된다.

캡처는 복사, 참조 로 전달 가능 하다.

_TotalMoney 를 람다 함수 내부로 참조로 가져와 사용하는 예제.
또한 for_each 를 사용하는 예제도
#include <tchar.h>
#include <vector>
#include <algorithm>
 
int test_func()
{
  std::vector<int> _Moneys;
  _Moneys.push_back(100);
  _Moneys.push_back(120);
  int _TotalMoney = 0;
  // [_TotalMoney]  : 복사
  // [&_TotalMoney] : 참조
  std::for_each( _Moneys.begin(), _Moneys.end(), [&_TotalMoney](int _m) {
    _TotalMoney += _m;
  } );
  wprintf(_T("_TotalMoney: %d\n"), _TotalMoney);
}  

[] 사이에

통째로 모두 참조, 복사하더라도 변수 각각에 다른 방식을 지정할 수 있다. 같은 변수에 대해 중복 설정은 안된다.

int v1, v2, v3, v4;
 
[&, v1, v2]{};   // v1, v2 는 복사. 나머지는 참조.
[=, &v1, &v2]{}; // v1, v2 는 참조. 나머지는 복사.
[v1, v1]{};      // 에러. 같은 변수 사용.
[&, &v1]{};      // 에러. 디폴트가 참조인데 v1을 다시 참조로 설정
[=, v1]{};       // 에러. 디폴트가 복사인데 v1을 다시 복사로 설정