(C++ : Template) template으로 배열인지 확인하기

Posted by : at

Category : Cpp


#include <iostream>
using namespace std;

template<typename T> void foo(T& a)
{
  if(is_array<T>::value)  // is_array는 이미 C++에 있지만 공부삼아 만들어 본다.
    cout << "array" << endl;
  else
    cout << "not array" << endl;
}

int main()
{
  int x[3] = {1,2,3};
  foo(x);
}
template<typename T> struct xis_array
{
  static constexpr bool value = false;
};

template<typename T, size_t N> struct xis_array<T[N]>   // 배열의 타입은 int[#]이기에
{
  static constexpr bool value = true;
};

template<typename T> struct xis_array<T[]>   // 크기를 알수없는 배열에 대해서 처리
{
  static constexpr bool value = true;
};

응용

template<typename T> struct xis_array
{
  static constexpr bool value = false;
  static constexpr size_t size = -1;
};

template<typename T, size_t N> struct xis_array<T[N]>
{
  static constexpr bool value = true;
  // 배열을 전달할때 배열의 크기 까지 전달이 가능하다
  static constexpr size_t size = N;
};

template<typename T> struct xis_array<T[]> 
{
  static constexpr bool value = true;
};

// xis_array<T>::size로 사용가능
// 참고로 C++에서는 배열의 크기를 구하는 함수를 지원
extent<T,0>::value

About Taehyung Kim

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

Star
Useful Links