(C++ : Template) couple을 만들고 자료형의 개수를 리턴

Posted by : at

Category : Cpp


couple에 자료형을 넣고 갯수를 리턴하게 해보자

#include <iostream>
using namespace std;

template<typename T> void printN(const T& cp)
{
  cout << T::N << endl;
}

template<typename T, typename U> struct couple
{
  T v1;
  U v2;
  enum { N = 2 };
};

int main()
{
    // 대략 이렇게 쓰고싶다는 말.
    couple<int, double> c1;
    printN(c1);
}
template<typename T, typename U> struct couple
{
  T v1;
  U v2;
  enum { N = 2 };
};

int main()
{
  couple<int, double> c1;
  couple<int, couple<int, char>> c2;
  couple<int, couple<int, couple<int, char>>> c3;
  printN(c1);   // 2
  printN(c2);   // 2
  printN(c3);   // 2
  // 데이터를 넣는데 까지는 성공 하지만 카운트를 리턴하는 것은 구현해야함.
}
template<typename T, typename U> struct couple
{
  T v1;
  U v2;
  enum { N = 2 };
};

template<typename A, typename B, typename C> 
struct couple<A, couple<B, C>>
{
  A v1;
  couple<B,C> v2;
  enum { N = couple<B,C>::N + 1 };
};
// 템플릿으로 자기 자신을 보내는 것을 주목하자

int main()
{
  couple<int, double> c1;
  couple<int, couple<int, char>> c2;
  couple<int, couple<int, couple<int, char>>> c3;
  printN(c1);   // 2
  printN(c2);   // 3
  printN(c3);   // 4
}
template<typename A, typename B, typename C> 
struct couple<couple<A, B>, C>
{
  couple<A,B> v1;
  C v2;
  enum { N = couple<A,B>::N + 1 };
};

int main()
{
  couple<int, double> c1;
  couple<couple<int, char>, int> c2;
  couple<ouple<int, couple<int, char>>, int> c3;
  printN(c1);   // 2
  printN(c2);   // 3
  printN(c3);   // 4
}

이런거도 처리가능?

// 마지막으로 다음을 처리해 보자.
int main()
{
  couple<coupe<int, int>, couple<int, int>> c4;
  printN(c4);
}
template<typename A, typename B, typename C, typename D> 
struct couple<couple<A, B>, couple<C, D>>
{
  couple<A,B> v1;
  couple<C,D> v2;
  enum { N = couple<A,B>::N + couple<C,D> };
};

couple로 2개씩 묶지말고 한 번에 묶을 순 없나?

#include <iostream>
using namespace std;

template<typename T, typename U> struct couple
{
  T v1;
  U v2;
  enum { N = 2 };
};

int main()
{
  couple<int, couple<int, double>> c3;
  xtuple<int, int, double> t3;    // 요걸 만들고 싶다
}
struct Null {};   // empty class

template<typename P1,
typename P2,
typename P3 = Null,
typename P4 = Null,
typename P5 = Null > 
class xtuple
{
  
};

int main()
{
  // xtuple은 2개 이상 5개 이하 자료형 처리가능
  xtuple<int, char, long, short, double> t5;    // okay
  xtuple<int, char, long> t3; // okay
}
template<typename P1,
typename P2,
typename P3 = Null,
typename P4 = Null,
typename P5 = Null > 
class xtuple : public couple<P1, xtuple<P2, P3, P4, P5, Null>>
{
};

temaplte<typename P1, typename P2>
class xtuple<P1, P2, Null, Null, Null> : couple<P1, P2>
{
};

int main()
{
  // couple<short, double>
  // couple<long, xtuple<short, double, Null, Null, Null>>
  // couple<char, xtuple<long, short, double, Null, Null>>
  // couple<int, xtuple<char, long, short, double, Null>>
  xtuple<int, char, long, short, double> t5;
}

About Taehyung Kim

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

Star
Useful Links