본문 바로가기
💻 programming/c++

[c++] fold expression

by 연구원-A 2021. 8. 5.
반응형

high-order function

함수형 프로그래밍 (functional programming)에서 함수는 고차 함수 (high-order)와 일차 함수 (first order)로 나뉜다. 고차 함수는 함수를 인자로 받거나 반환하는 형태를 의미하며, 일차 함수는 고차 함수가 아닌 모든 함수를 의미한다.

고차 함수가 필요한 이유는 고차 함수의 인자로 들어온 함수를 통해 데이터를 재귀적 (또는 반복적)으로 처리하기 위함이다.

#include <iostream>
auto twice = [](auto f, int v) { return f(f(v)); }
auto f = [](int i) { return i + 3; }

int main() {
    std::cout << twice(f, 7) << std::endl;
}

Output: 13

fold

Fold는 고차 함수 계열 중 하나로, 함수의 인자에 대해 특정 연산자를 재귀적으로 처리하고 결과를 반환하는 함수를 의미합니다.


Syntax

// fold expression
// (E op ...)       | (e1 + (e2 + (e3 + (e4 ... ))))
// (... op E)       | ((((e1 + e2) + e3) + e4) ... )
// (E op ... op I)  | (I + (e1 + (e2 + (e3 + (e4 ... )))))
// (I op ... op E)  | ((((e1 + e2) + e3) + e4) ... + I )

Sample Code

using namespace std;

// left fold is more easier to understand

template <typename... Ints>
int sum_all(Ints... nums) {
    return (... + nums);
}

template <typename... doubles>
double sub(doubles... args) {
    return (10 - ... - args);
    // 10 - 1 - 2 - 3 - 4
}

int main() {
    cout << sum_all(1, 4, 2, 3, 10) << endl;
    cout << sub(1, 2, 3, 4) << endl;
}

 

반응형

댓글