-
std::void_t<...>의 사용 예프로그래밍/c++ 2018. 5. 8. 01:00반응형
S C::* D
는 C타입의 멤버 변수 D의 포인터
class C{public:char a;char b;};auto pa = &C::a; // pa는 0auto pb = &C::b; // pb는 1pa == 0
pb == 1
이 문법은 구조체, 클래스를 상대로만 컴파일에 성공한다.
S C::*D의 문법은 int, float 같은 타입에는 동작하지 않는다.
즉, 다음 문법은 컴파일 자체가 불가능하다.
auto pc = int::*;이 속성을 이용해 클래스나 구조체 여부를 검사하는 클래스를 만들어보자.
// 1번template < typename T, typename = std::void_t<> >class IsClassOrStruct : public std::false_type {};// 2번template < typename T >class IsClassOrStruct<T, std::void_t<void* T::*>> : public std::true_type {};IsClassOrStruct의 템플릿 인자로 int, float 같은 원시 타입이 들어온다면 void* T::* 문법은 실패한다.
그래서 성공적인 컴파일이 가능하도록 1번에 매칭된다.
IsClassOrStruct의 템플릿 인자로 클래스 또는 구조체가 들어온다면 void* T::* 문법은 성공한다. 따라서 특수화 된 클래스인 2번에 우선적으로 매칭된다.
#include <type_traits>template < typename T, typename = std::void_t<> >class IsClassOrStruct : public std::false_type {};template < typename T >class IsClassOrStruct<T, std::void_t<void* T::*>> : public std::true_type {};class C{public:char a;char b;};int main(){bool c_is_a_class = IsClassOrStruct<C>::value; // 1bool int_is_a_class = IsClassOrStruct<int>::value; // 0return 0;}참고
https://kudwafter.moe/?p=58 << 요걸 보고 새로 본 걸 정리해야 겠다는 생각이 들었다.
http://en.cppreference.com/w/cpp/language/sfinae
http://en.cppreference.com/w/cpp/types/void_t
http://en.cppreference.com/w/cpp/language/pointer
https://stackoverflow.com/questions/27687389/how-does-void-t-work
반응형'프로그래밍 > c++' 카테고리의 다른 글
std::next_permutation, std::prev_permutation 순열 생성 (0) 2018.07.04 stl 컨테이너 환형 순회 (0) 2018.05.23 shared_ptr의 래퍼런스 카운팅은 스레드 세이프 한가? 정말? (0) 2018.04.22 std::variant는 참 빠르다 (1) 2018.04.18 std::array와 c array는 다르다? (0) 2018.03.11