(C++ : Template) C++에서 제공하는 표준 type_traits

Posted by : at

Category : Cpp


#include <iostream>
#include <type_traits>    // for remove_pointer, is_pointer
using namespace std;

template<typename T> void foo(T a)
{
  typename remove_pointer<T>::type n;
  bool b = is_pointer<T>::value;
}

int main()
{
  int n = 0;
  foo(&n);
}
#include <iostream>
#include <type_traits>    // for remove_pointer, is_pointer
using namespace std;
// C++14
// using remove_pointer_t = typename remove_pointer<T>::type;

template<typename T> void foo(T a)
{
  // 포인터를 제거한 타입을 구해보자.
  typename remove_pointer<T>::type n;
  // typename은 값으로 보지말고 type으로 봐달란 명령
  remove_pointer_t<T> n;    // C++14부터는 이렇게 간단하게 적을 수 있다.
}

int main()
{
  int n = 0;
  foo(&n);
}
#include <iostream>
#include <type_traits>    // for remove_pointer, is_pointer
using namespace std;

// C++ 17 - 아래를 지원
template<typename T>
inline constexpr bool is_pointer_v = is_pointer<T>::value;

void foo_imp(true_type) {}
void foo_imp(false_type) {}

template<typename T> void foo(T a)
{
  // T가 포인터 인지 알고 싶다
  bool b = is_pointer<T>::value;
  // bool b = is_pointer_v<T>;
  
  if /*constexpr*/ (is_pointer_v<T>)    // 이렇게 쓰면 에러 안남.
  {
    cout << *a << endl;   // error
  }
  foo_imp(is_pointer<T>());
}

int main()
{
  int n = 0;
  foo(&n);
}
#include <iostream>
#include <type_traits>    // for remove_pointer, is_pointer
using namespace std;

template<typename T> void foo(T& a) // 참조로 받음을 기억.
{
  // 배열인지 조사해 보자
  if(is_array<T>::value)
  {
    cout << extent<T, 0>::value << endl; // 3
    cout << extent<T, 1>::value << endl; // 2
  }
}

int main()
{
  int x[3][2] = {1,2,3,4,5,6};
  foo(x);
}
template<typename T, typename U> void foo(T a, U b)
{
  bool ret = is_same<T, U>::value;    // 같은 타입인지 조사한다.
  cout << ret << endl;
}

int main()
{
  foo(0, 0);
  foo<int, const int>(0,0);   // int, const int는 다르기에 다른 타입으로 판별
  // 만약 const를 붙여도 같은 타입으로 판별하고 싶다면??
}
template<typename T, typename U> void foo(T a, U b)
{
  // bool ret = is_same<T, remove_const<U>::type>::value;    // const를 제거해 준다.
  bool ret = is_same<T, remove_cv<U>::type>::value;           // const, volite을 모두 제거해 준다.
  cout << ret << endl;
}
template<typename T, typename U> void foo(T a, U b)
{
  bool ret = is_same<remove_cv<T>::type, remove_cv<U>::type>::value;
  cout << ret << endl;
}
int main()
{
  foo<int[3], int*>(0,0); // 다른 타입으로 추론
  // 만약 배열의 주소와 포인터를 같은 타입으로 추론하고 싶다면??
}
template<typename T, typename U> void foo(T a, U b)
{
  bool ret = is_same<typename decay<T>::type, typename decay<U>::type>::value;
  // 이 외에도 상당히 많은 trait가 있음 홈페이지를 참조하자
  cout << ret << endl;
}
int main()
{
  foo<int[3], int*>(0,0); // 다른 타입으로 추론
  // 만약 배열의 주소와 포인터를 같은 타입으로 추론하고 싶다면??
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links