본문 바로가기

반응형

진리는어디에/C++

(43)
[C++20] 코루틴(Coroutine) - done() [진리는어디에] - [C++20] 코루틴(Coroutine) [진리는어디에] - [C++20] 코루틴(Coroutine) - co_await [진리는어디에] - [C++20] 코루틴(Coroutine) - co_yield 이전 강의들을 톻해 C++20에서 코루틴을 생성하는 법, 코루틴을 중단하고 호출자로 돌아 오는 방법, 코루틴에서 호출자로 값을 리턴하는 방법을 알아 보았습니다. 이번 장에서는 일정한 범위의 숫자를 생성해내는 Range라는 코루틴 클래스를 만들어 보면서 코루틴의 끝을 탐지하는 방법과, Range 클래스에 iterator를 추가하여 일반 stl 컨테이너 처럼 ranged for를 이용할수 있도록 해보겠습니다 간략한 설명을 위해 예제 코드는 최대한으로 줄이고 있으나 본 포스트의 맨 아래에 전..
[C++20] 코루틴(Coroutine) - co_yield 이번 강의는 [C++20] 코루틴(Coroutine)에 이어지는 내용 입니다. 이번 강의를 읽으시기 전에 이전 포스팅을 먼저 읽어 보시길 추천 드립니다. co_yield 코루틴을 중단(suspend)하고 호출자에게 돌아갈 때, 호출자에게 값을 넘기고 싶다면 co_await대신 co_yield를 사용 하면 됩니다. Generator foo() { //co_await std::suspend_always{}; co_yield 10; } 하지만 컴파일러는 'co_yield' 구문을 만나면 내부적으로 다음과 같은 코드를 생성합니다. Generator foo() { Generator::promise_type promise; // ...코드 생략... // co_yield 10; co_await promise.yie..
[C++20] 컴파일 g++ g++ 버전 8부터 C++20의 컴파일이 가능합니다. C++20을 컴파일 하기 위해서는 커맨드라인에 아래 파라메터를 추가 합니다. g++ -std=c++20 만일 g++에서 코루틴을 사용한다면 -fcoroutines 옵션을 추가 해야 합니다. g++ -std=c++20 -fcoroutines Visual Studio 2019 비주얼 스튜디오는 16.3버전 이상 부터 C++20을 지원합니다. C++20을 활성화 시키기 위해서는 아래 두 가지 방법이 가능합니다. 1. '프로젝트 속성 > 일반 > C++ 언어 표준 > 미리보기 - 최신 C++ 초안의 기능(/std:c++latest)' 선택 2. '프로젝트 속성 > C/C++ > 명령줄'에 /std:c++latest 추가 Visual Studio에서 C..
[C++20] 코루틴(Coroutine) - co_await 안녕하세요. 저번 시간의 [진리는어디에] - [C++20] 코루틴(Coroutine)에서는 C++20에서 새로이 도입된 코루틴의 기본에 대해 알아 보았습니다. 이 포스팅은 지난 과정에 이어지는 내용이므로 저번 포스팅을 한번 살펴 보시고 오시는 것이 이번 포스팅을 이해하는데 좀 더 도움이 되리라 생각합니다. 이번 포스팅에서는 지난 시간에 이어 co_await 키워드에 대해 살펴 보는 시간을 갖도록 하겠습니다. co_await expr co_await는 단항 연산자로써, 코루틴의 실행을 중단(suspend)하고 호출자(caller)에게 제어권을 넘기는데 사용 됩니다. co_await의 피연산자(expr)는 co_await operator를 구현했거나 현제 코루틴의 Promise::await_trasnform..
[C++20] 코루틴(Coroutine) 1958년 멜빈 콘웨이에 의해 처음으로 개념이 만들어 졌으며 이미 많은 현대 프로그래밍 언어들에서 지원하고 있지만 C++에만 없던 코루틴이 C++20 부터 드디어 지원됩니다. 코루틴이 지원되는 것은 너무도 반갑고 만세를 불러야 하는 일인데, 역시 C++은 C++이었습니다. 유구한 역사와 전통을 자랑하는 '자유를 주는 대신 책임도 니가 져라'라는 C++의 정신 답게 코루틴 활용 방법에 자유를 준 대신, 편리한 사용성을 가져갔습니다. 덤으로 제대로 사용하지 못하는 경우의 책임도 사용자가 져야 합니다. 만일 C#과 파이썬, 자바스크립트와 같은 다른 언어의 코루틴 경험이 있으신 분이라면 무슨 코루틴 한번 쓰기가 이렇게 어렵냐고 생각하실지도 모르겠습니다. 하지만 이 글을 끝까지 읽어 보시면 C++코루틴도 나름 익..
[C++20] 람다 표현식의 변화 들어가며 이번 포스트에서는 C++20의 람다 표현식에 추가된 사항들을 살펴 볼 것이다. 간략하게 요약하면 아래 다섯 가지 정도로 정리 할 수 있다 : 템플릿 람다 추가 : 람다 표현식에서 템플릿 사용 가능 평가 되지 않은 표현식(unevaluated expression)에서 람다 표현식 사용 가능 캡쳐를 사용하지 않는 람다 표현식에서 디폴트 생성자와 대입 연산자 사용 가능 암시적인 this 캡쳐가 컴파일 시 경고 처리 됨(앞으로 deprecated 될 것이라고 경고) Parametaer Pack 캡쳐 가능 템플릿 람다 표현식(template lambda expression) 처음 살펴 볼 변경 사항은, C++20 부터 람다 표현식에도 템플릿의 사용이 가능해졌다는 것이다(기존 C++17까지는 람다 표현식에..
[C++20] 신규 기능 정리 새로운 문법 지원 콘셉(Concept) - 타입 오버라이딩을 넘어선 타입 속성에 따른 강력한 오버라이드 [C++20] 콘셉(Concept) 코루틴(Coroutine) [C++20] 코루틴(Coroutine) [C++20] 코루틴(Coroutine) - co_await [C++20] 코루틴(Coroutine) - co_yield [C++20] 코루틴(Coroutine) - co_return [C++20] 코루틴(Coroutine) - done() 모듈(Module) [C++20] 당신이 C++20에서 모듈을 써야만 하는 이유(#include와 모듈의 비교) [C++20] 모듈(module) 예제 상수성 지원 : constinit, consteval UTF-8 문자열 지원 : char8_t 신규 std 라이..
[C++11] 주요 변경/추가 사항 람다 표현식(Lambda Expressions) 람다 표현식은 함수를 선언한 곳에서 바로 호출 할 수 있도록 한다. 람다 표현식은 아래와 같은 형태를 가진다. [capture] (parameters) -> return-type { body } for_each() 알고리즘을 사용하여 문자열을 순회하며 대문자의 개수를 센다고 가정하자. 대문자인지 판단하기 위한 함수 객체를 넘겨 주는 대신 람다 표현식을 사용하면 보다 편리하게 코드 작성이 가능하다. int main() { char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) ..
[C++11] Variadic template(Parameter pack) Variadic template C++에서는 Parameter pack이라고 불리며, 수가 정해지지 않은 N개의 인자를 사용 할 수 있는 기능으로써 D언어와 C++ 11에서 지원하고 있다 en.cppreference.com/w/cpp/language/parameter_pack Parameter pack(since C++11) - cppreference.com A template parameter pack is a template parameter that accepts zero or more template arguments (non-types, types, or templates). A function parameter pack is a function parameter that accepts zero..
[C++] C++ 스타일 타입 캐스팅 들어가며 C 스타일의 타입 캐스팅은 자유도가 높은 대신 서로 캐스팅될 수 없는 타입임에도 불구하고 암시적으로 캐스팅 해버리고, 그 결과 정의 되지 않은 오류가 발생하게 되고 그 책임을 사용자에게 떠넘겨(?) 버린다. 이런 오류를 미연에 방지하고자 C++에는 새로운 스타일의 타입 캐스팅이 도입 되었고 의도된 대로 사용되지 않는 타입 캐스팅에 대해 컴파일 타임 오류 발생 시키도록 하였다. 이번 포스트에서는 새로이 추가된 C++ 스타일 캐스팅에 대해 살펴 보도록 하겠다. C++ 스타일 타입 캐스팅 : static_cast const_cast reinterpret_cast dynamic_cast static_cast static_cast는 상속 트리 내에서의 포인터형 번환만이 가능한 캐스팅 방법이다. 즉, 상속..

반응형