成员函数

在模板特化的以前的教训,我们看到它是如何可能的特化模板类的成员函数以提供特定的数据类型不同的功能。事实证明,它不仅是可能的特化的模板类的成员函数,它也可能是一整类!

考虑你想要设计一个类存储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 >类。

类模板特化为完全独立的类,即使他们被分配以同样的方式作为模板类。这意味着我们可以改变我们的专业类的所有东西,包括它的方式实施甚至功能使得公共,就像它是一个独立的类。这是我们的专业课:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值