[C++] 템플릿 패턴: SFINAE 기본

SFINAE는 템플릿 메타 프로그래밍의 핵심이 되는 기법으로,
"치환 실패는 오류가 아니다.(Substitution Failure Is Not An Error)"의 준말이다.

치환은 템플릿 치환을 말한다.
함수 템플릿들이 오버로딩돼있다고 가정해보자. image

image 첫번째 함수 템플릿은 웬만해서는 다 성공적으로 동작할 것이다. 그냥 T에 매칭되지 못할게 뭐 있겠는가.
문제는 두번째 함수 템플릿이다. 만약, 전달한 타입 인자에 ::NoType이란 타입이 없으면 어떻게 될까?
에러로 취급하지 않고, 그냥 함수 템플릿 목록에서 빼버린다! 그냥 그게 다다.
그래서 ::NoType이 없는 타입을 전달해서 호출하면 무조건 첫번째 함수 템플릿만 호출된다. image

image

그리고 ::NoType이 있으면 당연히 2번째 함수 템플릿이 호출된다. C++의 템플릿 시스템은 항상 가장 특수화된 버전을 선택하기 때문이다. image

image

응용으로 가자면 끝도 없이 복잡하고 끔찍해지지만, 일단 기본 규칙은 이렇다.


참조
https://github.com/jwvg0425/ModernCppStudy/wiki/SFINAE