개발/C++

C++20 신규 기능 정리

njsung 2023. 1. 25. 09:50
반응형

❗이 글은 ChatGPT와의 질답을 통해 작성되었습니다.


C++ 20은 여러 가지 새로운 기능을 추가하였습니다. 그 중에서는 다음과 같은 기능들이 있습니다:

  • Concepts: 템플릿 인수의 유효성을 컴파일 타임에 검사할 수 있는 기능.
        • Concepts는 템플릿 함수나 템플릿 클래스의 인수들이 원하는 조건(concept)을 만족하는지 컴파일 타임에 검사할 수 있는 기능입니다. 이를 통해서 템플릿 함수나 클래스를 사용할 때 오류를 최대한 빨리 확인 할 수 있게 됩니다.
        • 예를 들어, 아래의 함수 add()는 두 개의 값을 더하는 함수 입니다.
    template<typename T, typename U>
    auto add(T a, U b) {
        return a + b;
    }
        • 이 함수를 사용할 때 T, U 타입은 어떤 타입이든 가능하지만, 타입 T는 덧셈 연산이 가능해야 합니다.
          이를 Concepts를 사용하여 표현 할 수 있습니다.
        • Concepts를 사용하면 템플릿을 사용할 때 인수가 요구하는 조건을 만족하는지를 컴파일 타임에 검사할 수 있어서, 프로그래밍 시 오류를 최대한 빨리 잡을 수 있게 됩니다.
    template<typename T, typename U>
        requires std::is_addable<T, U>::value
    auto add(T a, U b) {
        return a + b;
    }
  • Coroutines: 코루틴(coroutine)을 지원하는 기능, 비동기 프로그래밍을 쉽게 할 수 있다.
      • Coroutines은 함수를 코루틴(coroutine)으로 작성할 수 있는 기능입니다. 코루틴은 일반 함수와 달리 다른 함수로 제어권을 넘길 수 있어 비동기 프로그래밍을 편리하게 할 수 있습니다.
      • 예를 들어, 아래의 코드는 제너레이터 함수를 코루틴으로 작성한 예제 입니다.
    generator<int> fibonacci() {
        int a = 0, b = 1;
        while (true) {
            co_yield a;
            int tmp = a;
            a = b;
            b += tmp;
        }
    }
    • 이 함수를 실행할 때, fibonacci() 함수는 처음에는 0을 반환하고, 그 다음에는 1을 반환 합니다. 그리고 이를 계속 반복하면서 피보나치 수열을 반환합니다.
    • Coroutines 기능을 사용하면, 일반적인 코드를 사용하는 것보다 더 간단하고 편리하게 비동기 코드를 작성할 수 있게 됩니다.
  • Modules: 모듈을 지원하는 기능, 코드를 보다 구조적으로 관리할 수 있다.
      • Modules는 모듈 시스템을 지원하는 기능입니다. 이 기능을 사용하면, 코드를 여러 파일로 분리하여 관리할 수 있고, 의존성 관리를 간편하게 할 수 있습니다.
      • 예를 들어, 아래의 코드는 math.cpp에 정의된 sqrt() 함수를 main.cpp에서 사용하는 예제입니다.
    //math.cpp
    export double sqrt(double value) {
        return std::sqrt(value);
    }
    //main.cpp
    import math;
    
    int main() {
        double value = sqrt(4);
        std::cout << value << std::endl;
        return 0;
    }
    • Modules 기능을 사용하면, 코드를 모듈 단위로 관리할 수 있고, 프로젝트가 커지면서 코드가 꼬이는 문제를 해결할 수 있습니다.
  • Ranges: 범위(range)를 지원하는 기능, 컬렉션을 더욱 쉽게 순회할 수 있다.
      • Ranges는 범위(range)를 지원하는 기능입니다. 이 기능을 사용하면, 컬렉션(collection)을 더욱 쉽게 순회할 수 있고, 코드를 더욱 간단하게 작성할 수 있습니다.
      • 예를 들어, 아래의 코드는 배열을 순회하는 예제입니다.
    std::array<int, 4> arr = {1, 2, 3, 4};
    
    for (int i : arr) {
        std::cout << i << std::endl;
    }
      • Ranges 기능을 사용하면, 컬렉션을 순회하는 코드를 더욱 간단하게 작성할 수 있습니다. 예를 들어, 아래와 같이 순회 중 특정 조건에 만족하는 값만 걸러내는 코드를 작성할 수 있습니다.
    std::vector<int> arr = {1, 2, 3, 4, 5};
    
    for (int i : ranges::filter(arr, [](int x){return x % 2 == 0;})) {
        std::cout << i << std::endl;
    }
    • Ranges 기능은 STL(Standard Template Library)를 확장하여, 컬렉션을 순회하는 기능과 조작하는 기능을 간단하게 작성할 수 있도록 해줍니다.

C++ 20은 현재 아직 정식 릴리즈되지 않았습니다. 정식 릴리즈되면 이러한 기능들을 사용할 수 있습니다.

728x90
반응형