참고 : https://modoocode.com/255 설명 잘되있는 한글 블로그
전문 : https://github.com/jwvg0425/ModernCppStudy/wiki/SFINAE
활용
std::enable_if
SFINAE 개념이 잘 활용되는 케이스로 std::enable_if가 있다.
template<bool B, class T = void>
struct enable_if
{};
template<class T>
struct enable_if<true, T>
{
using type = T;
};
std::enable_if가 실제로 어떤 형태로 활용되는지는 item 27에 잘 설명되어 있다. 간단히 요약하자면 위 Type SFINAE에서 스코프 지정 연산(::)에서 지정된 스코프 내에 존재하지 않는 타입을 사용한 경우를 활용하여 enable_if<true>::type
은 존재하지만 enable_if<false>::type
은 존재하지 않으므로 이를 바탕으로 특정한 경우에만 함수 템플릿을 사용할 수 있도록 만드는 것이다.
template<typename T,
typename = typename std::is_enable<is_class<T>::value>::type>
void f(T a);
예를 들어 위와 같이 f 함수를 선언할 경우, T 타입이 클래스 타입일 때만 Substitution이 성공하여 f 함수를 쓸 수 있게 된다(만약 T가 클래스가 아니라면 is_class::value는 false가 되고, std::is_enable::type은 존재하지 않으므로 Substitution이 실패하게 된다). 그 외의 경우는 SFINAE에 의해 위 함수 템플릿 자체가 무시되므로 템플릿의 사용에 일종의 제약을 걸 수 있게 되는 것이다.
'Generic Programming' 카테고리의 다른 글
enable if 두번째 예제 is Same 추가 (0) | 2019.03.30 |
---|---|
커리 반대쪽부터 채우기 (0) | 2019.03.30 |
가변인자 템플릿 파라미터 팩 재귀호출 예제 (0) | 2019.03.30 |
템플릿 예제 (0) | 2019.03.23 |
가변인자 템플릿 예제 (0) | 2019.03.22 |