본문 바로가기
c++/template프로그래밍.

type_trais

by kcj3054 2022. 5. 18.

type_trais

  • type_traits는 포인터인지 아닌지 타입을 알아내기 위해서 type traits 만드는 일반적인 방법이다..

is_pointer 구현..

소스

template<typename T>
struct Is_pointer
{
    //bool value = false가 안되는 이유는 이것은 변수이다.!! 변수이면 run time까지 가게되는데.. 밑의 Is_pointer<T>::value는 컴파일 시간에 사용이 되어야한다..
    //enum{value = false};

    static constexpr bool value = false;
};

//포인터 타입에 대해서부분 특수화..!
template<typename T>
struct Is_pointer<T*>
{
    //enum { value = true };
    static constexpr bool value = true;
};

template<typename T>
void foo(T v)
{
    //컴파일 시간에 사용한다고 메타함수라고한다..
    if (Is_pointer<T>::value)
        cout << "pointer" << endl;
    else
        cout << "not pointer " << endl;
}

int main()
{
    int n = 3;
    foo(n);
    foo(&n);

    return 0;
}
  • 위에서 Is_pointer를 만들 때 eum을 사용하고 bool을 사용하지 않은 이유는 enum을 사용하면 상수라서 컴파일 타임에 결정되기 때문에 사용했다.. 그렇지만 modern으로 오면서 static constexpr이 생겨서 이것은 타입 명시 가능 + 컴파일 타임이 가능해서 더 효과적이다.. 이것으로 사용..
  • 위에서 is_pointer는 이미 c++에 들어있다. 위에서 primarytemplate에서는 모든 것을 받으면서 false로 해 놓은 다음 포인터 타입만 받는 템플릿을 부분특수화로 따로 만들면서 그곳에는 true로 설정해놓으면된다..

is_array

소스

template<typename T>
struct Is_array
{
    static constexpr bool value = false;
};


template<typename T, size_t N>
struct Is_array<T[N]>
{
    static constexpr bool value = true;
};

template<typename T>
void foo(T& a)
{
    if (Is_array<T>::value)
        cout << "array" << endl;
    else
        cout << "not array" << endl;
} 

int main()
{
    int x[4] = { 1, 2, 3, 4 };
    foo(x);

    return 0;
}

remove_pointer

  • c++14?인가에서 type_traits에서 remove_ponter라고 포인터를 땐 타입을 알려는 것이 있다 이것을 구현해보자 일단 첫번째 스텝으로 하나의 포인터를 땐 것을 구현하고 c++에서 제공하지 않는 다중포인터를 때는 즉 모든 포인터를 제거하고 타입을 반환하는 것도ㅗ 구해보자.!!

remove_pointer..

#include <iostream>
#include <type_traits>  

using namespace std;

//==============remove-pointer

template<typename T>
struct RemovePointer
{
    typedef T type;
};

template<typename T>
struct RemovePointer<T*>
{
    typedef T type;
};

template<typename T>
void foo(T a)
{
    typename RemovePointer<T>::type t;
}

int main()
{
    int n = 10;
    foo(&n);
    return 0;
}
  • 구현은 모든 type_trais가 거의 동일하다. 일단 primamry template을 만들어 놓고 시작하면서 필요한 것들을 부분특수화하면서 하면된다.

  • 위에서 그대로 타우고 T* 를 받는 것을 만들어주면 그대로 T를 반환해주면된다 모양을 확인하면서 이해하면된다.

remove_all_pointer

  • ㅊ=+