2015-01-16 星期五 8:23:43
1、主模板/原始模板
当我们讨论显式(非显示,相对于隐式)特化或偏特化时,常把最泛化的那个template称为primary template(主模板/原始模板)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//主模板 原始模板
template
<
class
TObj,
class
TArgs,
bool
withSender =
true
>
class
Delegate:
public
AbstractDelegate<TArgs>
{
};
template
<
class
TObj,
class
TArgs>
class
Delegate<TObj, TArgs,
false
>:
public
AbstractDelegate<TArgs>
{
};
template
<
class
TObj>
class
Delegate<TObj,
void
,
true
>:
public
AbstractDelegate<
void
>
{
};
template
<
class
TObj>
class
Delegate<TObj,
void
,
false
>:
public
AbstractDelegate<
void
>
{
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
//主模板 原始模板
template
<
typename
R,
class
TList>
class
Item;
template
<
typename
R>
class
Item<R, NullType>
{
public
:
typedef
R ResultType;
virtual
ResultType operator()() = 0;
virtual
Item *Clone()
const
= 0;
virtual
~Item(){}
};
template
<
typename
R,
typename
P1>
class
Item<R, TYPELIST_1(P1) >
{
public
:
typedef
R ResultType;
//typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef
P1 Parm1;
virtual
ResultType operator()(Parm1) = 0;
virtual
Item *Clone()
const
= 0;
virtual
~Item(){}
};
//2个参数
template
<
typename
R,
typename
P1,
typename
P2>
class
Item<R, TYPELIST_2(P1, P2) >
{
public
:
typedef
R ResultType;
typedef
P1 Parm1;
typedef
P2 Parm2;
Item()
{
printf
(
"line %d, Item::%s\n"
, __LINE__, __func__);
}
virtual
ResultType operator()(Parm1, Parm2) = 0;
virtual
Item *Clone()
const
= 0;
virtual
~Item(){}
};
//3个参数
template
<
typename
R,
typename
P1,
typename
P2,
typename
P3>
class
Item<R, TYPELIST_3(P1, P2, P3) >
{
public
:
typedef
R ResultType;
typedef
P1 Parm1;
typedef
P2 Parm2;
typedef
P3 Parm3;
Item()
{
printf
(
"line %d, Item::%s\n"
, __LINE__, __func__);
}
virtual
ResultType operator()(Parm1, Parm2, Parm3) = 0;
virtual
Item *Clone()
const
= 0;
virtual
~Item(){}
//DEMO只用到3个参数的,其他Template就不增加了
protected
:
item_e m_eType;
//CDC m_DC;//设备上下文
//CRect m_Rect;
};
|