참고 : 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에 의해 위 함수 템플릿 자체가 무시되므로 템플릿의 사용에 일종의 제약을 걸 수 있게 되는 것이다.

+ Recent posts