태그: template
17편
-
C++ 헤더 온리 라이브러리 만들기: inline·템플릿·constexpr과 ODR, multiple definition 피하기
구현을 헤더에 두면서도 multiple definition 링커 에러 없이 배포하려면 inline, 템플릿, constexpr가 ODR과 어떻게 맞물리는지 알아야 합니다. extern template로 인스턴스화를 줄이는 법과 컴파일 시간, ABI 관점의 비용도 짚습니다.
-
C++ 전달 참조(유니버설 레퍼런스): T&&가 lvalue도 받는 조건과 std::forward
템플릿의 T&&가 rvalue 참조가 아니라 lvalue와 rvalue를 모두 받는 포워딩 참조가 되는 조건을 설명합니다. 넘긴 인자에 따라 T가 int&와 int로 달리 추론되는 과정, std::forward로 완벽 전달하는 팩토리·emplace 예제, forward 누락 실수를 다룹니다.
-
C++ <type_traits>로 타입 검사·변환하기: SFINAE 원리, enable_if 위치, decay와 커스텀 traits
C++ <type_traits>로 컴파일 타임에 타입을 검사·변환하는 방법을 정리합니다. SFINAE 동작 원리, enable_if 위치별 차이, decay·remove_reference 활용법과 실전 함정을 다룹니다.
-
C++ 템플릿 인자 추론 | template argument deduction 가이드
함수 템플릿에 값으로 넘기면 const와 참조가 사라지고 배열은 포인터로 decay되는 등, 컴파일러가 인자에서 T를 추론하는 규칙을 예제로 정리합니다. 타입 불일치로 추론이 실패할 때 고치는 법, 완벽한 전달, C++17 CTAD도 다룹니다.
-
C++20 템플릿 람다: auto 람다와 차이, Concepts로 타입 제한하기
C++20 템플릿 람다의 명시적 템플릿 매개변수 문법과 Concepts를 이용한 타입 제약, 여러 매개변수·파라미터 팩·제네릭 팩토리 패턴 등 실전 활용법과 자주 발생하는 컴파일 에러 해결법을 코드로 정리합니다.
-
C++ 템플릿 템플릿 인자 | template template parameter 가이드
vector<int>처럼 구체화된 타입이 아니라 vector 자체를 템플릿 인자로 받는 template template parameter 문법을 설명합니다. 표준 컨테이너의 Allocator 인자 때문에 매칭이 실패하는 문제, C++17 typename 선언, 컨테이너 정책 주입 예제를 다룹니다.
-
C++ 태그 디스패칭: iterator_category로 오버로드 고르기와 if constexpr·Concepts 비교
값이 아니라 빈 구조체 타입으로 오버로드를 고르는 태그 디스패칭을 std::distance의 iterator_category 분기 예제로 설명합니다. 타입별 직렬화와 복사 최적화 예제, if constexpr·SFINAE·Concepts와 비교했을 때 언제 이 패턴이 여전히 읽기 쉬운지도 다룹니다.
-
C++ SFINAE vs Concepts | 언제 마이그레이션해야 할까
enable_if로 쓴 SFINAE 코드를 C++20 Concepts와 requires 표현식으로 옮기면 무엇이 좋아지고 무엇이 어려워지는지 같은 예제로 비교합니다. 에러 메시지 품질, 레거시 코드 호환성, 과도한 제약과 순환 의존 같은 마이그레이션 함정을 다룹니다.
-
C++ 레퍼런스 축약 규칙: 전달 참조 T&&와 std::forward가 동작하는 원리
템플릿에서 T&와 &&가 겹칠 때 & 하나라도 있으면 T&가 된다는 레퍼런스 축약 규칙을 설명하고, 이 규칙이 전달 참조 T&&와 std::forward를 가능하게 하는 과정, typedef·decltype·auto에서 축약이 일어나는 경우를 예제로 보여줍니다.
-
C++ 정책 기반 설계: 템플릿 매개변수로 동작을 컴파일 타임에 조합하기
C++ Policy-Based Design으로 템플릿 매개변수를 통해 컴파일 타임에 동작을 조합하는 방법을 정리합니다. 스마트 포인터, 로거, 컨테이너 성장 전략 예제와 인터페이스 불일치·복잡도 함정을 다룹니다.
-
C++ Mixin 패턴: 템플릿 상속으로 로깅·카운팅 기능 조합하기
템플릿 매개변수로 받은 기반 클래스를 상속해 로깅·카운팅 같은 기능 조각을 필요한 클래스에만 조합하는 C++ Mixin 패턴을 다룹니다. 다중 Mixin, CRTP Mixin, 조건부 기능 선택, 메서드 체이닝을 예제로 보여 줍니다.
-
C++17 if constexpr: 컴파일 타임 분기로 템플릿 단순화하기와 static_assert(false) 문제
if constexpr는 선택되지 않은 분기를 인스턴스화하지 않아 타입별 처리를 템플릿 하나로 쓸 수 있게 해 줍니다. 재귀 종료와 SFINAE 대체 예제, else에 static_assert(false)를 넣으면 생기는 문제, 분기마다 반환 타입이 달라지는 함정을 짚습니다.
-
C++ 제네릭 람다: auto 매개변수와 C++20 템플릿 람다
제네릭 람다의 auto 매개변수·템플릿 연역, 클로저와 operator() 모델, 완벽 전달, SFINAE·requires, 프로덕션 패턴과 STL 활용까지 정리합니다. 제네릭 람다(generic lambda)는 C++14에서 도입된 기능으로, 람다의 매개변수에 auto를 사용해 여러 타입에 대해 같은 본문을 재사용할 수 있게 합니다. 내부적으로는 클로저 타입의 operator()가 함수 템플릿이 됩니다.
-
C++ Expression Templates: 벡터 연산의 임시 객체를 없애는 지연 평가 구현
a + b + c 같은 벡터 연산이 매 단계 임시 객체를 만드는 문제를 Expression Templates로 풀어, 연산을 식 트리로 쌓아 두었다가 대입 시점에 한 번의 루프로 평가하는 방법을 구현합니다. auto로 받았을 때의 댕글링과 앨리어싱 함정도 짚습니다.
-
C++ enable_if와 SFINAE: 템플릿 조건부 활성화 패턴과 C++20 Concepts로 바꾸기
std::enable_if를 이용한 SFINAE 기반 템플릿 조건부 활성화 원리와 반환 타입·템플릿 매개변수·함수 매개변수 활용 패턴, C++20 Concepts로의 전환까지 실전 코드로 정리합니다.
-
C++ CRTP: 가상 함수 없이 정적 다형성 구현하기와 C++23 deducing this
C++ CRTP(Curiously Recurring Template Pattern)로 가상 함수 없이 정적 다형성을 구현하는 방법을 카운터 믹스인, 비교 연산자 자동 생성, 싱글톤, 체이닝 인터페이스 예제로 정리합니다. 가상 함수와의 성능 비교와 캐스팅·순환 의존 함정까지 다룹니다.
-
C++17 CTAD: 클래스 템플릿 인자 추론 원리와 추론 가이드가 필요한 경우
C++17 CTAD가 클래스 템플릿 인자를 추론하는 원리, 반복자 생성자처럼 추론 가이드가 꼭 필요한 경우, 그리고 vector{v}·map 중첩 중괄호·explicit처럼 자주 틀리는 동작을 컴파일해 확인한 예제로 정리합니다.