예전에 C++17 스터디 때 만들었던 발표 자료 중 일부를 포스팅합니다.
C++ 17부터 추가된 Fold Expression
C++ 11에서 도입된 가변 길이 템플릿은 매우 편리하지만 한 가지 단점이 있다.
재귀 가변 템플릿을 구성할때, 반드시 재귀 호출 종료를 위한 함수를 따로 만들어야 한다는 것이다.
C++ 17에서 Fold Expression이 등장하게 된 계기중 하나.
가변 인수 템플릿과 파라미터 팩??
가변 인수 템플릿은 템플릿 매개변수의 개수가 고정되어 있지 않아, 템플릿 매개변수의 개수를 지정하지 않게 정의할 수 있다.
이때 typename 뒤에 " ... " 으로 오는 것을 템플릿 파라미터 팩이라고 한다.
재귀 호출
int sum_all { return 0; } 과 같이
재귀 함수 호출을 종료하기 위해 베이스 케이스를 꼭 만들어줘야 했고, 이는 코드의 복잡도를 쓸데없이 늘리게 된다.
Fold Expressions 사용
컴파일러는 return ... + nums ; 에 ()가 fold 식에 포함되는 것으로 해석한다.
Fold Expressions 종류
C++ 17에서 지원하는 Fold 방식의 종류는 총 4가지가 있다.
단항 우측 Fold (Unary Right Fold)
unpack시 operator를 우측 (index가 늦은 순서)부터 적용시킨다.
단항 좌측 Fold (Unary Left Fold)
unpack시 operator를 좌측 (index가 빠른 순서)부터 적용시킨다.
이항 우측 Fold (Binary Right Fold)
이항 우측 폴드 표현식은 Init 값을 가진다.
Init은 파라미터 팩에 포함되지 않는 값이며, 폴드 표현식의 Left / Right 여부 관계없이 가장 먼저 operator의 대상이 된다.
unpack시 operator를 우측 (index가 늦은 순서)부터 적용시킨다.
이항 좌측 Fold (Binary Left Fold)
unpack시 operator를 좌측 (index가 빠른 순서)부터 적용시킨다.
'개발 🛠💻 > C++, Modern C++' 카테고리의 다른 글
[전문가를 위한 C++] 11장 11.1.6 레퍼런스와 포인터의 선택 기준 (0) | 2023.04.09 |
---|---|
맨날 헷갈리는 volatile과 std::atomic (0) | 2022.11.07 |
STL 컨테이너별 시간 복잡도 (0) | 2022.08.05 |
C++ 특수 멤버 함수와 The rule of three five zero (3/5/0) (0) | 2022.07.25 |
C++ 스마트포인터 성능 (0) | 2022.07.07 |
댓글