수색…
비고
접기 식은 다음 연산자에 지원됩니다.
+ | - | * | / | % | \ | & | | | << | >> | ||
+ = | - = | * = | / = | % = | \ = | & = | | = | << = | >> = | = | |
== | ! = | < | > | <= | > = | && | || | , | . * | -> * |
빈 시퀀스를 접을 때 다음 세 연산자를 제외하고 fold 표현식이 잘못되었습니다.
운영자 | 매개 변수 팩이 비어있는 경우의 값입니다. |
---|---|
&& | 참된 |
|| | 그릇된 |
, | 빈() |
단수 폴드
단항 접기는 특정 연산자에 대해 매개 변수 팩 을 접는 데 사용됩니다. 단항 폴드에는 2 가지 종류가 있습니다.
Unary Left Fold
(... op pack)
는 다음과 같이 확장됩니다.((Pack1 op Pack2) op ...) op PackN
단항 오른쪽 배
(pack op ...)
는 다음과 같이 확장됩니다.Pack1 op (... (Pack(N-1) op PackN))
여기에 예제가있다.
template<typename... Ts>
int sum(Ts... args)
{
return (... + args); //Unary left fold
//return (args + ...); //Unary right fold
// The two are equivalent if the operator is associative.
// For +, ((1+2)+3) (left fold) == (1+(2+3)) (right fold)
// For -, ((1-2)-3) (left fold) != (1-(2-3)) (right fold)
}
int result = sum(1, 2, 3); // 6
이진 접기
이진 접기는 기본적으로 단항 접기 이며 추가 인수가 있습니다.
바이너리 폴드에는 2 가지 종류가 있습니다 :
이진 왼쪽 배 -
(value op ... op pack)
- 다음과 같이 확장됩니다.(((Value op Pack1) op Pack2) op ...) op PackN
이진 오른쪽 배
(pack op ... op value)
- 다음과 같이 확장됩니다.Pack1 op (... op (Pack(N-1) op (PackN op Value)))
다음은 그 예입니다.
template<typename... Ts>
int removeFrom(int num, Ts... args)
{
return (num - ... - args); //Binary left fold
// Note that a binary right fold cannot be used
// due to the lack of associativity of operator-
}
int result = removeFrom(1000, 5, 10, 15); //'result' is 1000 - 5 - 10 - 15 = 970
쉼표 위로 접기
매개 변수 팩의 각 요소에 대해 특정 기능을 수행해야하는 것은 일반적인 작업입니다. C ++ 11에서 우리가 할 수있는 최선의 방법은 다음과 같습니다.
template <class... Ts>
void print_all(std::ostream& os, Ts const&... args) {
using expander = int[];
(void)expander{0,
(void(os << args), 0)...
};
}
그러나 fold expression을 사용하면 위의 내용이 다음과 같이 간소화됩니다.
template <class... Ts>
void print_all(std::ostream& os, Ts const&... args) {
(void(os << args), ...);
}
비밀스러운 상용구가 필요하지 않습니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow