태그: SFINAE
8편
-
C++ 템플릿 메타프로그래밍 심화 — SFINAE·타입 특성·태그 디스패치
템플릿 메타프로그래밍(TMP)에서 컴파일러가 오버로드 후보를 거르는 SFINAE 규칙, type_traits의 구현 원리, 태그 디스패치와 if constexpr의 선택 기준, 컴파일 타임 계산을 어디에 둘지를 라이브러리 설계 관점에서 정리합니다.
-
C++ 템플릿 에러 메시지 읽는 법: 첫 줄·note·candidate 순서와 자주 나오는 패턴
수백 줄짜리 C++ 템플릿 에러에서 맨 위 첫 줄, note: because, candidate 목록 순으로 원인을 찾는 방법을 설명하고, no matching function이나 incomplete type 같은 10가지 패턴과 GCC·Clang·MSVC 메시지 차이를 비교합니다.
-
C++ SFINAE vs Concepts | 언제 마이그레이션해야 할까
enable_if로 쓴 SFINAE 코드를 C++20 Concepts와 requires 표현식으로 옮기면 무엇이 좋아지고 무엇이 어려워지는지 같은 예제로 비교합니다. 에러 메시지 품질, 레거시 코드 호환성, 과도한 제약과 순환 의존 같은 마이그레이션 함정을 다룹니다.
-
SFINAE 패턴 정리: enable_if, void_t, Detection Idiom과 Concepts로 옮길 시점
C++ SFINAE 정리. enable_if, void_t와 표현식 검사, Detection Idiom과 is_detected, 템플릿 오버로드 분기, 레거시 SFINAE 코드를 C++20 Concepts로 옮기는 기준을 다룹니다.
-
C++ type traits 활용: 표준 traits, std::enable_if, 커스텀 traits 작성
정수만 받아야 할 템플릿에 vector를 넘겨 긴 에러가 나는 상황에서 출발해 is_integral·decay 같은 표준 traits, enable_if를 두는 위치별 차이, void_t로 멤버 존재를 검사하는 커스텀 traits를 다룹니다. if constexpr로 대체할 시점도 설명합니다.
-
C++ 템플릿 특수화: 모든 타입에 같은 로직을 쓸 수 없을 때 완전·부분 특수화로 푸는 법
bool만 true/false로 출력하고 싶을 때처럼 타입마다 다른 동작이 필요할 때 완전 특수화와 부분 특수화를 어떻게 나눠 쓰는지 예제로 보여줍니다. 함수 템플릿은 왜 부분 특수화 대신 오버로드를 써야 하는지, ODR 위반과 모호성 에러도 다룹니다.
-
C++20 Concepts: SFINAE를 대체하는 제약 문법과 Subsumption
난해한 템플릿 에러 메시지를 C++20 Concepts로 바꾸는 방법을 enable_if 코드와 나란히 비교합니다. requires 절과 requires 표현식, 표준 concept 계층, subsumption으로 오버로드 우선순위가 정해지는 원리와 흔한 제약 에러도 다룹니다.
-
C++ 템플릿 기초: 함수·클래스 템플릿, 가변 인자, SFINAE에서 Concepts까지
타입마다 복사하던 함수를 template<typename T>로 합치는 것부터 시작해 타입 추론 규칙과 max(3, 3.14)가 실패하는 이유, 템플릿 링크 에러, 가변 인자 템플릿과 fold expression, 특수화, SFINAE와 Concepts까지 단계적으로 설명합니다.