[C++] 템플릿 패턴: 타입 SFINAE -> is_class

SFINAE엔 여러가지 응용법이 있는데, 그 중 하나가 특정 타입의 특성을 확인할 수 있게 해주는 타입 SFINAE다.

c++11의 표준 헤더 type_trait에서 제공되는 타입식별 기능들이 이 패턴을 통해 구현된다.

type_trait에 있는 is_class라는 녀석을 한번 구현해보자.
이건 해당 타입이 클래스인지 아닌지를 체크해준다.

좀 복잡하다. 클래스에 대해서만 유효한 타입 치환식을 설정해놓고,
해당 치환이 선택되면 yes.
선택되지 않으면 가변인자 함수가 no를 반환하도록 했다. image

image int Arg::*는 Arg라는 클래스의 int 타입 멤버변수를 가리키는 포인터라는 뜻이다.
당연히 클래스가 아니면 실패할 것이다.

저렇게 잘 짰다면, 이렇게 사용할 수 있다. image

image 잘 동작한다.


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