Skip to content

Commit 47c505c

Browse files
authored
Add files via upload
1 parent a51662c commit 47c505c

8 files changed

+398
-0
lines changed

Typelist1.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
// Andrei Alexandrescue, loki 라이브러리, Modern C++ Design
5+
6+
// 1. 값을 보관하지 않는다.
7+
// 2. N개의 타입을 보관한다.
8+
template<typename T, typename U> struct Typelist
9+
{
10+
typedef T Head;
11+
typedef U Tail;
12+
};
13+
14+
int main()
15+
{
16+
Typelist<int, double> t1; //
17+
Typelist<int, Typelist<int, double>> t2; //
18+
Typelist<int, Typelist<int, Typelist<char, double>>> t3; //
19+
20+
}
21+
22+
23+
24+
25+
26+
27+
28+
29+
30+
31+

Typelist2.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
// Step2. NullType 과 매크로 도입
5+
6+
// Typelist : 타입을 여러개 보관하는 type의 list(값이 아님.)
7+
8+
template<typename T, typename U> struct Typelist
9+
{
10+
typedef T Head;
11+
typedef U Tail;
12+
};
13+
14+
struct NullType {};
15+
16+
// 매크로 도입
17+
#define TYPELIST_1(T1) Typelist<T1, NullType>
18+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
19+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
20+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
21+
22+
23+
int main()
24+
{
25+
Typelist<int, NullType> t1;
26+
Typelist<int, Typelist<double, NullType>> t2;
27+
//Typelist<int, Typelist<double, Typelist<char, NullType>>> t3;
28+
29+
TYPELIST_1(int) t4; //
30+
TYPELIST_4(int, double, char, short) t4; //
31+
}
32+
33+
34+
35+
36+
37+
38+
39+
40+
41+
42+
43+

Typelist3.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
template<typename T, typename U> struct Typelist
5+
{
6+
typedef T Head;
7+
typedef U Tail;
8+
};
9+
struct NullType {};
10+
11+
#define TYPELIST_1(T1) Typelist<T1, NullType>
12+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
13+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
14+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
15+
16+
//-------------------------------------------
17+
template<typename T> class xtuple {};
18+
19+
int main()
20+
{
21+
//xtuple<int> t1;
22+
23+
xtuple< TYPELIST_3(int, double, char) > t1;
24+
25+
}
26+
27+
28+
29+
30+
31+
32+
33+
34+
35+
36+

Typelist4_Length.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
template<typename T, typename U> struct Typelist
5+
{
6+
typedef T Head;
7+
typedef U Tail;
8+
};
9+
struct NullType {};
10+
11+
#define TYPELIST_1(T1) Typelist<T1, NullType>
12+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
13+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
14+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
15+
//-----------------------------------------------------------------------------------------------------
16+
// Typelist의 요소 갯수 구하기.
17+
18+
// 1. 사용하는 모습을 보고 primary template 작성.
19+
template<typename T> struct Length;
20+
//{
21+
//};
22+
23+
// 2. 갯수를 구할수 있도록 부분 특수화
24+
template<typename T, typename U> struct Length<Typelist<T, U>>
25+
{
26+
enum { value = Length<U>::value + 1 };
27+
};
28+
29+
// 3. 재귀를 종료 하기 위한 전문화(특수화)
30+
template<> struct Length<NullType>
31+
{
32+
enum { value = 0 };
33+
};
34+
35+
36+
template<typename T> void test()
37+
{
38+
cout << Length<T>::value << endl; // 4
39+
}
40+
41+
int main()
42+
{
43+
test< TYPELIST_4(int, char, short, double) >();
44+
}
45+
46+
47+
48+
49+
50+
51+
52+

Typelist5_TypeAt.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
template<typename T, typename U> struct Typelist
5+
{
6+
typedef T Head;
7+
typedef U Tail;
8+
};
9+
struct NullType {};
10+
11+
#define TYPELIST_1(T1) Typelist<T1, NullType>
12+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
13+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
14+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
15+
//-----------------------------------------------------------------------------------------------------
16+
// Typelist의 N 번째 요소의 타입 구하기
17+
// 1. 사용하는 코드를 보고 primary template 작성.
18+
// T : Typelist
19+
template<typename T, int N> struct TypeAt;
20+
21+
22+
// 2. 원하는 타입을 구할수 있도록 부분특수화
23+
// T : Typelist의 요소 타입
24+
/*
25+
template<typename T, typename U, int N> struct TypeAt<Typelist<T, U>, N>
26+
{
27+
typedef ? type;
28+
};
29+
*/
30+
// N == 0 일때.
31+
template<typename T, typename U> struct TypeAt<Typelist<T, U>, 0>
32+
{
33+
typedef T type;
34+
};
35+
36+
// N != 0 일때.
37+
template<typename T, typename U, int N> struct TypeAt<Typelist<T, U>, N>
38+
{
39+
typedef typename TypeAt<U, N-1>::type type;
40+
};
41+
42+
43+
44+
template<typename T> void test()
45+
{
46+
typename TypeAt<T, 3>::type n; // char
47+
48+
cout << typeid(n).name() << endl;
49+
50+
}
51+
52+
53+
int main()
54+
{
55+
test<TYPELIST_4(int, char, double, long)>();
56+
}
57+
58+
59+
60+
61+
62+
63+
64+

Typelist6_Append.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
template<typename T, typename U> struct Typelist
5+
{
6+
typedef T Head;
7+
typedef U Tail;
8+
};
9+
struct NullType {};
10+
11+
#define TYPELIST_1(T1) Typelist<T1, NullType>
12+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
13+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
14+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
15+
//-------------------------------------------------------------------------------------------
16+
// Typelist 끝에 타입 추가하기.
17+
18+
template<typename TL, typename T> struct Append;
19+
20+
21+
// TL T
22+
// 1. NullType, NullType => NullType
23+
template<> struct Append<NullType, NullType>
24+
{
25+
typedef NullType type;
26+
};
27+
28+
// 2. NullType, 임의의타입 => Typelist<임의의타입, NullType>
29+
template<typename T> struct Append<NullType, T>
30+
{
31+
typedef Typelist<T, NullType> type;
32+
};
33+
34+
// 3. NullType, Typelist<Head, Tail> => Typelist<Head, Tail>
35+
template<typename Head, typename Tail> struct Append<NullType, Typelist<Head, Tail> >
36+
{
37+
typedef Typelist<Head, Tail> type;
38+
};
39+
40+
// 4. Typelist<Head, Tail>, NullType => Typelist<Head, Tail>
41+
template<typename Head, typename Tail> struct Append<Typelist<Head, Tail>, NullType >
42+
{
43+
typedef Typelist<Head, Tail> type;
44+
};
45+
46+
47+
// 5. Typelist<Head, Tail>, T => Typelist<Head, Append<Tail, T>::type>
48+
49+
template<typename Head, typename Tail, typename T> struct Append<Typelist<Head, Tail>, T >
50+
{
51+
typedef Typelist<Head, typename Append<Tail, T>::type> type;
52+
};
53+
54+
55+
56+
57+
58+
template<typename T> void test()
59+
{
60+
typename Append<T, int>::type t1;
61+
62+
cout << typeid(t1).name() << endl; // int, char, double, int, NullType
63+
}
64+
65+
int main()
66+
{
67+
test<TYPELIST_3(int, char, double)>();
68+
}

Typelist7_MakeCode.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <iostream>
2+
using namespace std;
3+
4+
template<typename T, typename U> struct Typelist
5+
{
6+
typedef T Head;
7+
typedef U Tail;
8+
};
9+
struct NullType {};
10+
11+
#define TYPELIST_1(T1) Typelist<T1, NullType>
12+
#define TYPELIST_2(T1, T2) Typelist<T1, Typelist<T2, NullType>>
13+
#define TYPELIST_3(T1, T2, T3) Typelist<T1, Typelist<T2, Typelist<T3, NullType>>>
14+
#define TYPELIST_4(T1, T2, T3, T4) Typelist<T1, Typelist<T2, Typelist<T3, Typelist<T4, NullType>>>>
15+
16+
//-------------------------------------------------------------------------------------------
17+
// Typelist 활용
18+
19+
// Holder : 임의 타입의 data 하나 보관..
20+
template<typename T> struct Holder
21+
{
22+
T value;
23+
};
24+
25+
// GenScatterHierachy => MakeCode
26+
27+
template<typename T, template<typename> class Unit>
28+
class MakeCode : public Unit<T>
29+
{
30+
};
31+
32+
template<template<typename> class Unit>
33+
class MakeCode<NullType, Unit>
34+
{
35+
};
36+
37+
int main()
38+
{
39+
MakeCode<int, Holder> mc1; // 기반 클래스 Holder<int> 이므로
40+
MakeCode<double, Holder> mc2; // Holder<doulbe>
41+
MakeCode<NullType, Holder> mc3; // empty
42+
}
43+
44+

0 commit comments

Comments
 (0)