사용자 도구

사이트 도구


language:cpp:cpptip

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
language:cpp:cpptip [2017/06/24 18:29] kieunslanguage:cpp:cpptip [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +====== 포인터 배열 자동 삭제 (auto_ptr 흉내) ======
 +<code cpp>
 +std::vector<BYTE> vector(cbType);
 +pType = (WM_MEDIA_TYPE*)&vector[0];
 +</code>
 +
 +====== __event ======
 +
 +2015 부터는 삭제될 예정이니 쓰지 말라고 경고를 띄운다.
 +
 +  * [[https://msdn.microsoft.com/en-us/library/mt723604.aspx|Visual C++ What's New 2003 through 2015]]
 +  * Deprecation of attributed ATL code support (Level 1 (/W1) on-by-default)
 +  * C4467 경고 발생. 경고를 없애고 싶다면,
 +    * 컴파일 옵션 :  /Wv:18 or /wd:4467 \\ <sub>또는</sub>
 +    * 코드에 %%#pragma warning(disable:4467)%% 추가 
 +
 +전에 쓰던 방법처럼
 +
 +  * 함수 포인터를 사용하던지
 +  * std::function 과 std::bind를 조합해서 쓰던지
 +  * ( 함수 포인터 or (std::function)) 과 람다 함수를 쓰던지
 +
 +====== 람다 ======
 +
 +이름이 필요 없는 즉석 함수. C++ 언어는 c#과는 좀 다르게 구성되어 있다.
 +
 +<code cpp>
 +{
 +  []  // 람다 시작 (캡쳐)
 +  ()  // 파라미터 정의 창
 +  {}  // 함수 본체
 +  (); // 함수 호출. 호출하는 경우.
 +  
 +  // 예2 : 바로 실행
 +  auto fn1 = []() { /* 어쩌구 저쩌구 */ }();
 +  
 +  // 예2 : 선언만 해서 넘기는 경우
 +  auto fn2 = []() { /* 어쩌구 저쩌구 */ };
 +}
 +</code>
 +
 +파라미터가 있는 경우
 +
 +<code cpp>
 +auto _fn = []( int n ) { std::cout << "Num: " << n << std::endl; };
 +_fn( 100 );
 +_fn( 200 );
 +</code>
 +
 +리턴 값에 대한 설정의 경우
 +
 +  * return 이 실행 되면 알아서 리턴 타입이 설정된다.
 +  * 정확하게 하려면 '함수본체'의 앞 부분에 리턴 타입을 설정 한다.
 +
 +<code cpp>
 +// 알아서 설정 되도록
 +auto tfn1 = []() { return 3.14f; };
 +auto tfn2 = []( float _f ) { return f; }; 
 +// 확실히 지정한다.
 +auto tfn2 = []( float _f ) -> float { return f; }; 
 +</code>
 +
 +캡처
 +
 +람다 함수 외부의 변수를 람다 함수에서 사용하고 싶은 경우, 그 변수를 캡쳐<sup>Capture</sup>하면 된다.
 +
 +캡처는 **복사**, **참조** 로 전달 가능 하다.
 +
 +  * 참조로 전달할 때는 &
 +  * 복사로 전달할 때는 **변수 이름**을 적는다.
 +  * 람다 표현의 '[]' 사이에 캡처할 변수 이름을 적는다.
 +
 +| _TotalMoney 를 람다 함수 내부로 참조로 가져와 사용하는 예제. \\ 또한 for_each 를 사용하는 예제도 |
 +| <code cpp>
 +#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);
 +}  
 +</code> |
 +
 +%%[]%% 사이에 
 +
 +  * 변수 이름을 한개 이상 적을 수 있다.<code cpp>
 +int v1, int v2;
 +[&v1, &v2](){}(); // 이런 식으로
 +</code>
 +  * 이름을 적은 변수들은 람다 함수 내부에서 사용할 수 있다.
 +  * 전체를 통째로 복사 또는 참조 하려면 '[]' 사이에 
 +    * '[&]' : 통째로 참조
 +    * '[=]' : 통째로 복사
 +
 +통째로 모두 참조, 복사하더라도 변수 각각에 다른 방식을 지정할 수 있다.
 +같은 변수에 대해 중복 설정은 안된다.
 +
 +<code cpp>
 +int v1, v2, v3, v4;
 +
 +[&, v1, v2]{};   // v1, v2 는 복사. 나머지는 참조.
 +[=, &v1, &v2]{}; // v1, v2 는 참조. 나머지는 복사.
 +[v1, v1]{};      // 에러. 같은 변수 사용.
 +[&, &v1]{};      // 에러. 디폴트가 참조인데 v1을 다시 참조로 설정
 +[=, v1]{};       // 에러. 디폴트가 복사인데 v1을 다시 복사로 설정
 +</code>
 +
 +
 +