在模板特化的以前的教训,我们看到它是如何可能的特化模板类的成员函数以提供特定的数据类型不同的功能。事实证明,它不仅是可能的特化的模板类的成员函数,它也可能是一整类!
考虑你想要设计一个类存储8个对象的情况下。这是一个这么做的简单的类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
template
< typename
T> class
Storage8 { private : T
m_tType[8]; public : void
Set( int
nIndex, const
T &tType) { m_tType[nIndex]
= tType; } const
T& Get( int
nIndex) { return
m_tType[nIndex]; } }; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
int
main() { //
Define a Storage8 for integers Storage8< int >
cIntStorage; for
( int
nCount=0; nCount<8; nCount++) cIntStorage.Set(nCount,
nCount); for
( int
nCount=0; nCount<8; nCount++) std::cout
<< cIntStorage.Get(nCount) << std::endl; //
Define a Storage8 for bool Storage8< bool >
cBoolStorage; for
( int
nCount=0; nCount<8; nCount++) cBoolStorage.Set(nCount,
nCount & 3); for
( int
nCount=0; nCount<8; nCount++) std::cout
<< (cBoolStorage.Get(nCount) ? "true"
: "false" )
<< std::endl; return
0; } |
这个例子打印:
0
1
2
3
4
5
6
7
虚假的
真的
真的
真的
虚假的
真的
真的
真的
虽然这类是完全功能,结果发现Storage8 < bool >实施远比它需要更多的低效能。因为所有的变量必须有一个地址,和CPU不能解决任何小于一个字节,所有的变量必须至少有一个字节。因此,bool类型的一个变量最终使用整个字节虽然在技术上,它只需要一个单位来存储它的值为真或假!因此,一个bool是有用的信息和7位的浪费空间,1点。我们Storage8 < bool >类,其中包含8本书,1个字节的价值的有用的信息和7种浪费的空间。
事实证明,使用一些基本的位逻辑,所有的8本书压缩到一个单字节的可能,消除浪费的空间完全。然而,为了做到这一点,我们需要有效的根本改造类,取代8,一个是单字节变量数组大小。虽然我们可以创造一个完全新的类来做,这有一个主要的缺点:我们给它一个不同的名字。然后,程序员必须记住Storage8<t >是非布尔类型,而storage8bool(或无论我们命名新的类)是书。这是我们想避免不必要的复杂性。幸运的是,C + +为我们提供了一个更好的方法:类模板的特化。
类模板的特化
类模板的特化允许我们专门为特定的数据类型的模板类(或一组数据类型,如果有多个模板参数)。在这种情况下,我们将使用类模板的特化编写一个定制版本的boolStorage8 < >,将优先考虑在通用Storage8<t >类。
类模板特化为完全独立的类,即使他们被分配以同样的方式作为模板类。这意味着我们可以改变我们的专业类的所有东西,包括它的方式实施甚至功能使得公共,就像它是一个独立的类。这是我们的专业课: