728x90
반응형
C++
의SFINAE
(Substitution Failure Is Not An Error
) 는 템플릿 메타프로그래밍(template meta programming
)의 핵심 개념 중 하나 입니다.- 이는
C++
에서 템플릿 인자 치환(substitution
) 과정에서 오류가 발생하더라도 그 자체로 컴파일 에러가 되지 않도록 허용 하는 규칙입니다. - 대신 컴파일러는 다른 오버로드 후보를 탐색하거나, 템플릿 인스턴스화를 포기하게 됩니다.
-
템플릿 인자 대체 시 오류가 발생하면, 컴파일러는 해당 함수 템플릿을 무시하고 다른 후보를 계속 찾는다.
-
이 규칙 덕분에 다양한 조건부 템플릿 코드 작성이 가능해졌습니다.
-
cpp
#include <type_traits> #include <iostream> template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func(T t) { std::cout << "정수 타입입니다: " << t << "\n"; } template<typename T> typename std::enable_if<std::is_floating_point<T>::value, void>::type func(T t) { std::cout << "실수 타입입니다: " << t << "\n"; }
-
cpp
func(42); // 정수 타입입니다 func(3.14); // 실수 타입입니다 // func("hello"); → 컴파일 에러 (문자열에 대한 적절한 템플릿 없음)
- 여기서
std::enable_if
는bool
조건이true
일 경우에만 타입을 생성하게 하며,false
이면 치환 실패(Substitution Failure
) 가 발생해 그 오버로드는 무시됩니다.
- 템플릿 인자에 따라 조건부 코드 작성을 하고 싶지만, 타입이 맞지 않아 에러가 나버리면 전체 템플릿 인스턴스가 실패하게 됩니다.
SFINAE
는 이러한 조건부 인스턴스화를 가능하게 해줍니다.
C++20
부터는SFINAE
대신Concepts
와requires
표현식 을 사용하는 것이 더 명확하고 간결합니다.
-
cpp
template<typename T> requires std::integral<T> void func(T t) { std::cout << "정수 타입입니다: " << t << "\n"; }
-
도구 설명 std::enable_if
조건에 따라 타입을 정의/배제 std::is_same
두 타입이 같은지 비교 std::is_base_of
상속 관계 확인 decltype(...)
+void_t
표현식이 유효한지 검증하는 패턴
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
728x90
반응형
'C C++' 카테고리의 다른 글
C++ 버전 별 템플릿 타입 유추(Deduction Guide) 기능 구현 비교 (0) | 2025.03.30 |
---|---|
C++20 컴파일 타임 함수 : consteval과 constinit (0) | 2025.03.30 |
C++ 뷰(View) 타입과 소유(Ownership) 타입 (0) | 2025.03.29 |
C++20 분기 예측 : [[likely]], [[unlikely]] (0) | 2025.03.29 |
C++ 테스트 프레임워크에서의 부동소수점(float, double) 근사 비교(Approximate Comparison) (0) | 2025.03.28 |