본문 바로가기

프로그래밍 언어 노트/C++ | Modern C++

[Modern C++] Fold 표현

template<typename... Args>
auto RightFold(Args... args)
{
    return (args - ...);
}

template<typename... Args>
auto LeftFold(Args... args)
{
    return (... - args);
}

template<typename... Args>
auto RightFoldWithInit(Args... args)
{
    return (args - ...  - 1);
}

template<typename... Args>
auto LeftFoldWithInit(Args... args)
{
    return (1 - ... - args);
} 

int main()
{
    std::cout << RightFold(1, 2, 3, 4) << std::endl;            // (1-(2-(3-4)))    // Unary Right simple examples
    std::cout << LeftFold(1, 2, 3, 4) << std::endl;             // (((1-2)-3)-4)    // Unary Left simple examples
    std::cout << RightFoldWithInit(2, 3, 4) << std::endl;       // (2-(3-(4-"1")))  // Binary Right simple examples
    std::cout << LeftFoldWithInit(2, 3, 4) << std::endl;        // ((("1"-2)-3)-4)  // Binary Left simple examples

    cout << endl;
}

C++ 에서 폴드의 표현방식

Right와 Left의 예를들기위해서 - 오퍼레이터를 사용한예시이다.

주석은 실행되는것을 풀어쓴거고 Binary 의 경우 초기값을 가지는 폴드로써 주석에서는 "" 안에 초기값을 적어놓았다.

C++ 에서는 ... 과 값들의 위치에따라 Right,Left가 정해진다.

 

728x90