C++的模板对于那些可以被多种类型重用的代码是非常有用的,如:Symbian C++中的泛型集合RArray和RPointerArray就是使用的模板来实现的。但是,使用普通C++模板会带来代码尺寸大大增加的问题。本文将分为“C++模板基础”、“TBuf分析”、“瘦模板”三个部分,逐步深入讲解Symbian C++瘦模板的概念和使用方法。
一、C++模板基础
在这一部分中不会详细的介绍C++的模板,只会已不同的代码的形式介绍C++模板的几种不同的使用方法,在这里只会以类模板作为例子。如果大家想对C++模板进行更深一步的了解,请参阅《C++ Templates》一书。
1、类模板的声明
template <typename T> class TStudent
{
...
};
而在Symbian SDK中,我们看到的最常见的形式是:
template <class T> class TStudent
{
...
};
在上面的代码中,T通常成为“模板参数”。以上两种模板声明方式效果是一样的,template <class T>的声明形式会容易让人产生误解,在此不一定非要类类型才能作为模板参数,相比之下template <typename T>的形式更好一些。
2、类模板的特化
类似于函数重载,类模板提供了对模板参数的重载,实现了对不同类型的参数的不同处理,这一个过程就叫做类模板的特化。通过以下代码可以简单的说明这一点:
1 template <typename T> class TStudent
2 {
3 public:
4 void DoPrint()
5 {
6 console->Write(_L("T"));
7 }
8 };
9
10 template <> class TStudent<TInt>
11 {
12 public:
13 void DoPrint()
14 {
15 console->Write(_L("TInt"));
16 }
17 };
18
19 LOCAL_C void MainL()
20 {
21 TStudent<TUint> stu1;
22 stu1.DoPrint();
23
24 console->Write(_L("\n"));
25
26 TStudent<TInt> stu2;
27 stu2.DoPrint();
28 }
29
以上代码的作用:如果TStudent的模板参数为TInt型,则在屏幕上打印“TInt”,否则打印“T”。
输出结果: