알고리즘 자체는 학부 2학년 수준입니다. 딱 보면 idiom이 보일 정도로 코드를 썼습니다. (Modern C++ Design을 참고했습니다.) 한 번 죽 내려가면서 읽어보기만 해도 이해하시리라 믿습니다. 그나저나 이런걸 만들어서 대체 어디에 써먹냐. 그냥 지적 유희가 아니냐라고 물어볼 수 있겠습니다만. 그러니까 최적화 할 기회는 단지 포인터냐 아니냐에만 있는 것이 아니란 말이지요. 결국 이 타입이 어떤 분류에 속하는가에 따라 찍어내야 할 코드가 달라지게 됩니다. 그 때마다 일일이 길다랗게 코딩하는 삽질을 할 수는 없고, 이렇게 적당히 타입목록을 몇가지 만들어놓고 이 타입이 해당 카테고리에 있는지 확인하려면 그냥 메타함수를 호출하면 됩니다. 어차피 Boost MPL 라이브러리에 다 있습니다만, 한 번 이렇게 써보면 내부 동작도 잘 이해할 수 있으니까요.
길어서 안 올라가길래 세 부분으로 쪼갰습니다. (..);;
그나저나 너저분하게 보이는 것은 어쩔 수가 없군요. 이렇게 SNR이 낮아서야 orz
길어서 안 올라가길래 세 부분으로 쪼갰습니다. (..);;
그나저나 너저분하게 보이는 것은 어쩔 수가 없군요. 이렇게 SNR이 낮아서야 orz
class null_type {};
template <typename T, typename U>
struct type_list
{
typedef T head;
typedef U tail;
};
namespace tl
{
// is same type?
template <class T, class U>
struct is_same
{
enum { value = 0 };
};
template <class T>
struct is_same<T, T>
{
enum { value = 1 };
};
// length of type list
template <typename List> struct length;
template <> struct length<null_type>
{
enum { value = 0 };
};
template <typename T, typename U>
struct length<type_list<T, U> >
{
enum { value = 1 + length<U>::value };
};
// access element using index of type list
template <typename List, unsigned int i> struct at;
template <typename Head, typename Tail>
struct at<type_list<Head, Tail>, 0>
{
typedef Head result;
};
template <typename Head, typename Tail, unsigned int i>
struct at<type_list<Head, Tail>, i>
{
typedef typename at<Tail, i-1>::result result;
};
// find type
template <typename List, typename T> struct find;
template <typename T>
struct find<null_type, T>
{
enum { value = -1 };
};
template <typename T, typename Tail>
struct find<type_list<T, Tail>, T>
{
enum { value = 0 };
};
template <typename Head, typename Tail, typename T>
struct find<type_list<Head, Tail>, T>
{
private:
enum { temp = find<Tail, T>::value };
public:
enum { value = (temp == -1) ? -1 : 1 + temp };
};
template <typename T, typename U>
struct type_list
{
typedef T head;
typedef U tail;
};
namespace tl
{
// is same type?
template <class T, class U>
struct is_same
{
enum { value = 0 };
};
template <class T>
struct is_same<T, T>
{
enum { value = 1 };
};
// length of type list
template <typename List> struct length;
template <> struct length<null_type>
{
enum { value = 0 };
};
template <typename T, typename U>
struct length<type_list<T, U> >
{
enum { value = 1 + length<U>::value };
};
// access element using index of type list
template <typename List, unsigned int i> struct at;
template <typename Head, typename Tail>
struct at<type_list<Head, Tail>, 0>
{
typedef Head result;
};
template <typename Head, typename Tail, unsigned int i>
struct at<type_list<Head, Tail>, i>
{
typedef typename at<Tail, i-1>::result result;
};
// find type
template <typename List, typename T> struct find;
template <typename T>
struct find<null_type, T>
{
enum { value = -1 };
};
template <typename T, typename Tail>
struct find<type_list<T, Tail>, T>
{
enum { value = 0 };
};
template <typename Head, typename Tail, typename T>
struct find<type_list<Head, Tail>, T>
{
private:
enum { temp = find<Tail, T>::value };
public:
enum { value = (temp == -1) ? -1 : 1 + temp };
};




덧글
電腦人間 2005/07/24 15:23 # 답글
이걸 써봐야 손에 익을 텐데, 써볼 일이 없네요.
J.Min 2005/07/26 00:59 # 삭제 답글
나는 학부 2학년도 안되는가보아.. 훌쩍.