블로그
-
C++ 태그 디스패칭: iterator_category로 오버로드 고르기와 if constexpr·Concepts 비교
값이 아니라 빈 구조체 타입으로 오버로드를 고르는 태그 디스패칭을 std::distance의 iterator_category 분기 예제로 설명합니다. 타입별 직렬화와 복사 최적화 예제, if constexpr·SFINAE·Concepts와 비교했을 때 언제 이 패턴이 여전히 읽기 쉬운지도 다룹니다.
-
C++ 템플릿 인자 추론 규칙: 값·참조·전달 참조, decay, CTAD
함수 템플릿에 값으로 넘기면 const와 참조가 사라지고 배열은 포인터로 decay되는 등, 컴파일러가 인자에서 T를 추론하는 규칙을 예제로 정리합니다. 타입 불일치로 추론이 실패할 때 고치는 법, 완벽한 전달, C++17 CTAD도 다룹니다.
-
C++20 템플릿 람다: auto 람다와 차이, Concepts로 타입 제한하기
C++20 템플릿 람다의 명시적 템플릿 매개변수 문법과 Concepts를 이용한 타입 제약, 여러 매개변수·파라미터 팩·제네릭 팩토리 패턴 등 실전 활용법과 자주 발생하는 컴파일 에러 해결법을 코드로 정리합니다.
-
C++ 템플릿 메타프로그래밍 심화 — SFINAE·타입 특성·태그 디스패치
템플릿 메타프로그래밍(TMP)에서 컴파일러가 오버로드 후보를 거르는 SFINAE 규칙, type_traits의 구현 원리, 태그 디스패치와 if constexpr의 선택 기준, 컴파일 타임 계산을 어디에 둘지를 라이브러리 설계 관점에서 정리합니다.
-
C++ 템플릿 템플릿 인자 | template template parameter 가이드
vector<int>처럼 구체화된 타입이 아니라 vector 자체를 템플릿 인자로 받는 template template parameter 문법을 설명합니다. 표준 컨테이너의 Allocator 인자 때문에 매칭이 실패하는 문제, C++17 typename 선언, 컨테이너 정책 주입 예제를 다룹니다.
-
C++ this 포인터: 메서드 체이닝, 자기 대입 검사, 람다 this 캡처 수명
멤버 함수 안의 this가 호출한 객체를 가리키는 원리를 메서드 체이닝, 자기 대입 방지, 콜백 등록 예제로 보여줍니다. 매개변수와 멤버 이름 충돌, static 멤버 함수에 this가 없는 이유, 람다에 [this]를 캡처했을 때의 수명 문제도 다룹니다.
-
C++ thread_local: 스레드별 카운터·버퍼, 초기화 시점과 소멸 순서
thread_local 변수는 이름은 하나지만 스레드마다 별도 메모리에 존재해 락 없이 스레드별 카운터·버퍼·난수 생성기를 만들 수 있습니다. 스레드 시작 시와 첫 사용 시 초기화 차이, 클래스 멤버 선언 방법, 소멸 순서와 메모리 사용량 함정을 다룹니다.
-
C++20 삼원 비교 연산자 <=>: strong·weak·partial_ordering 고르는 기준과 = default
C++20 <=> 연산자 하나로 <, <=, >, >=를 생성하는 방법과 strong·weak·partial_ordering 중 반환 타입을 고르는 기준을 설명합니다. = default의 사전식 비교, 대소문자 무시 같은 커스텀 비교, ==가 따로 생성되는 규칙도 다룹니다.
-
C++ 시간·타이머·세마포어 유틸리티 지도: 벤치마크, 주기 작업 드리프트, counting_semaphore, 날짜 서식
sleep_for로 만든 주기 작업의 누적 드리프트, sleep_until의 보정, counting_semaphore로 동시 실행 수 제한, std::format 날짜 서식을 직접 실행해 확인하고 스톱워치, 타이머, 로케일 글로 연결합니다.
-
C++ sleep_for·sleep_until로 주기 작업 만들기: 누적 드리프트와 짧은 sleep의 부정확함
sleep_for와 sleep_until, yield로 주기 작업과 타임아웃을 만들 때 생기는 문제를 예제로 다룹니다. sleep_until로 누적 드리프트를 줄이는 법, 짧은 sleep의 부정확함, 바쁜 대기의 비용, steady_clock을 써야 하는 이유, Asio 타이머와의 연계도 설명합니다.