본문 바로가기

반응형

C/C++

(66)
[C++] 템플릿 특화(Template specialize) 완벽 가이드 템플릿 특화란? C++은 하나의 코드로 다양한 타입에 대응할 수 있는 템플릿이라는 도구를 제공한다. 이 글을 읽는 여러분은 이미 템플릿에 대해서는 알고 있다고 가정하고, 이번 포스트에서는 템플릿 특화(Template specialization)에 대해 살펴 보도록하낟. 템플릿 특화(Template specialization)는 특정 타입의 템플릿 인자에 대응하는 특별한 템플릿 클래스를 정의할 수 있는 기능이다. 참고로 템플릿 특화는 템플릿 특수화라고도 번역 되며 특화나 특수화나 같은 의미니 다른 곳에서 특수화라고 표현되는 글을 본다고 하더라도 당황하지 말도록 한다. 설명을 위해 우선 아래 일반 템플릿 클래스의 예제 코드를 살펴 보도록 하자. 아래에서는 템플릿 인자로 T와 U를 받을 수 있는 Widget이..
[C++] UTF-8 문자열 길이 C++은 강력한 프로그래밍 언어지만 그에 반해 부족한 부분도 많다. 특히 문자열 관련해서는 타의 추종을 불허할 정도로 불편하다. 이번 포스트에서는 C++에서 UTF-8 문자열의 개수를 세어 보도록 하겠다. UTF-8 인코딩 규칙 보통 UTF-8관련 포스팅이라면, UTF-8의 인코딩 역사 부터, 유니코드와의 관계 등등 장황한 이야기가 펼쳐지지만 여기서는 코드를 작성 할 수 있을 정도의 짧고 얇은 지식만 요약하고 넘어 간다. 밑줄 그어진 부분을 집중해서 보자. UTF-8인코딩은, 유니코드 한 문자를 나타내기 위해 1바이트에서 부터 4바이트까지 사용하는 "가변 길이" 문자열 인코딩 방식이다. 문자에 따라 문자를 표현하기 위해 1바이트에서 4바이트까지 다양한 길이를 가진다. 1바이트로 표시된 문자의 최상위 비트..
도메인 이름을 이용해 IP 주소 얻기(getaddrinfo) #include #include #include int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res ); struct addrinfo { int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ int ai_family; /* AF_XXX */ int ai_socktype; /* SOCK_XXX */ int ai_protocol; /* 0 or IPPROTO_XXX for IPv4, IPv6 */ size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *a..
[socket] socket 함수에 관한 고찰 들어가며 프로그래밍을 공부하면서 최소한 소켓 프로그래밍라는 것에 대해서 한 두번은 들어 보셨다고 가정하겠습니다. 그렇지 않으시다면 이 포스팅을 찾아서 읽고 계실 이유가 없겠지요. 뭐, 그것이 아니라면 최소한 소켓프로그래밍에 관심이 있어 어디에서 든지 배워 보고자 하시는 분들이겠지요. 따라서 소켓의 역사니, 어쩌고 귀찮은 이야기 들은 하지 않도록 하겠습니다. 간단 명료하게 시작하도록 하겠습니다. 소켓프로그램을 시작하기 위해서는 '소켓(socket)'이라는 것이 필요 합니다. 너무 당연한 말인가요? 일단 소켓이라는 것이 무엇인지에 대해서 먼저 알아보도록 하겠습니다. 전산학에 관련된 모든 정의를 내린다고 해도 과언이 아닐 정도로 정의를 많이 가지고 있는 RFC문서에 따르자면 아래와 같이 이야기 하고 있습니다...
[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/C++] scanf시 엔터 무시 하기 C/C++에서 표준 입력을 받아야 하는 경우 엔터가 입력으로 받아져, 정작 받아야 할 입력을 건너 뛰는 경우가 있습니다. 다음 예를 살펴 볼까요 : char ch1, ch2; printf("첫번째 문자를 입력하시오"); scanf("%c", &ch1); printf("두번째 문자를 입력하시오"); scanf("%c", &ch2); 위와 같이 코딩을 한다면 첫번째 문자를 입력하고 엔터를 치게 되면, 입력 버퍼에 엔터 문자가 남아있게 되어 두번째 입력에서 엔터를 자동적으로 입력을 받아 버리기에 정상적인 입출력이 이루어지지 않습니다. 위 문제를 해결하기 위해 fflush(FILE* fp) 함수와 잘 알려지지 않은 방법으로 "%*c" 포멧을 사용할 수 있습니다. fflush는 입력 버퍼 버퍼를 비워버리고, %*..
[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++코루틴도 나름 익..

반응형