C++4 Variadic Template 활용 - std::bind 스타일 Task 구현 실행 인자가 나중에 정해지는 경우실행 시점에 전달되는 인자가 필요한 경우는 여러 가지가 있다.대표적인 예로, 비동기 IO 작업이 있는데,작업이 완료될 때 비로소 실행에 필요한 정보를 얻게 된다. 예를 들어, IOCP에서는 작업이 완료되는 시점에 다음과 같은 정보가 함께 전달된다. GetQueuedCompletionStatus 의 반환 값TransferredBytesRIOStatus (Registered IO 사용 시) 따라서 IOCP 루프는 보통 다음과 같은 형태를 가진다.BOOL ret = GetQueuedCompletionStatus( hIocp, &transferredBytes, &completionKey, &overlapped, INFINITE); 그리고 보통 이런 식.. SFINAE 와 C++ 20 concept / requires 템플릿 메타 프로그래밍의 본질본질적으로 C++ 템플릿 프로그래밍은타입만으로 판단할 수 있는 정보를 이용해 컴파일 타임에 동작을 결정하는 방식의 구현이라고 볼 수 있다.템플릿은 프로그램이 실행되기 이전, 즉 컴파일 단계에서 타입 정보를 기반으로 코드를 생성한다.이 과정에서 컴파일러는 타입이 가진 다양한 특성을 분석하고, 그에 따라 적절한 구현을 선택하거나 새로운 코드를 만들어낸다.예를 들어 어떤 타입이 정수인지, 특정 연산을 지원하는지, 특정 멤버 함수를 가지고 있는지와 같은 정보들은 모두 타입 자체만으로도 판단할 수 있다.이러한 정보를 이용해 컴파일 단계에서 분기나 선택을 수행하는 방식이 바로 템플릿 메타 프로그래밍이다.간단한 예를 보자.#include #include templatevoid print_.. std::apply 의 내부 구현 직관적으로 직접 구현해 보기std::apply는 “튜플을 인자로 함수 호출을 수행하는 유틸리티”다.즉 작업이 실행되는 시점에 tuple에 저장된 인자들을 가지고 다시 함수 호출의 구문 형태로 복원한다.이를 직관적으로 구현한다면, 이런 식으로 가능하다. 튜플 크기를 N이라고 할 때아직 처리하지 않은 원소 개수 remain을 템플릿 파라미터로 두고std::get(t)로 다음 원소를 하나 꺼내서호출 인자 팩(bound...) 뒤에 누적한다핵심, 특수화를 통해서 remain 이 0일 때는 되면 최종 호출을 수행하도록 한다. #include #include #include #include template struct MyInvokeSeq{ template static constexpr decltype.. Variadic Template 활용 - Job / Callback 의 구현 "작업" 의 객체화작업을 객체화해야 하는 상황이 있다.예를 들어 다음과 같은 경우다. 스레드 간 작업 위임Job Queue 기반 처리비동기 작업 완료 후 결과 핸들링 이런 구조에서는 어떤 작업을 지금 실행하는 것이 아니라,어딘가에 저장해 두었다가 나중에 실행해야 한다.즉 “작업”이라는 개념을 객체 형태로 표현할 수 있어야 한다. 작업의 본질작업이라는 것을 조금 단순화해서 생각해보면 구조는 어렵지 않다.어떤 작업을 수행하려면 최소한 다음 두 가지 정보가 필요하다.무엇을, 어떻게 할지 알면 된다.이를 코드 관점에서 해석하면, 다음과 같다. 무엇을 -> 호출 함수어떻게 -> 그 함수에 전달될 인자 이 둘을 객체화 시키면 된다. variadic template - 인자의 개수와 타입은 모두 다르다. 실제 코드.. 이전 1 다음