一、了解隐式接口和编程器多态
1. template及泛型编程的世界,与面向对象的根本不同点。
class 和 templates 都支持接口和多态。
面向对象:显示接口和运行期多态,以函数签名为中心。
template:隐式接口和编译器多态,奠基于有效表达式。
二、了解typename的双重意义
提问:以下template声明中,class和typename有何不同?
template<class T> class Widget;
template<typename T> class Widget;
答:当声明template类型参数,class和typename的意义完全相同。
例外:请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list
(成员初值列)内以它作为base class 修饰符。
三、学习处理模板化基类内的名称
迷惑:
class CompanyA{
public:
void SendClearText(const std::string& msg){}
void SendEncrypted(const std::string& msg){}
};
class CompanyB{
public:
void SendClearText(const std::string& msg){}
void SendEncrypted(const std::string& msg){}
};
class CompanyZ
{
public:
void SendEncrypted(const std::string& msg){}
};
class MsgInfo{
};
template<typename Company>
class MsgSender{
public :
void SendClear(const MsgInfo& info)
{
std::string msg;
Company c;
c.SendClearText(msg);
}
void SendSecret(const MsgInfo& info)
{
std::string msg;
Company c;
c.SendEncrypted(msg);
}
};
template<typename Company>
class LoggingMsgSender: public MsgSender<Company> {
public:
void SendClearMsg(const MsgInfo& info)
{
SendClear(info);
}
};
在vs2005上还是通过编译?? 与书上讲解不一致
四、将与参数无关的代码抽离template
共性和变性分析,时期概念平民化
template造成的代码膨胀问题?
实际上,膨胀的是多数是目标代码,而非源代码,后者通常是变小了。template主要目的之一就是为了源代码复用,复用当然是避免代码冗余了。
Things to Remember
·templates(模板)产生多个 classes 和多个 functions,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
·non-type template parameters(非类型模板参数)引起的膨胀常常可以通过用 function parameters(函数参数)或 class data members(类数据成员)替换 template parameters(模板参数)而消除。
就是把C++模板中与参数无关的代码分离出来。也就是让与参数无关的代码只有一份拷贝。
例子:
template <class T>
2 class Base
3 {
4 public:
5 void work(int num)
6 {
7 cout < < "work ";
8 cout < < num < < endl;
9 }
10 };
11
12 template <class T, int num>
13 class Derived : public Base <T>
14 {
15 public:
16 void work()
17 {
18 Base <T>::work(num);
19 }
20 };
21
22 int main()
23 {
24 Derived <int, 1>d1;
25 Derived <int, 2>d2;
26 Derived <int, 3>d3;
27
28 d1.work();
29 d2.work();
30 d3.work();
31 return 0;
32 }
·type parameters(类型参数)引起的膨胀可以通过让具有相同的二进制表示的实例化类型共享实现而减少。
五、运用成员函数模板接收所有兼容类型
六、请使用traits class 表现类型信息
1. traits classses 使得类型相关信息在编译期可用。他们以templates和templates特化完成实现。
2. 整合重载技术overloaing后,traits classes有可能在编译器对类型执行if。。。else测试。
七、认识template 元编程
所谓模板元程序:是以C++写成、执行于C++编译器内的程序。
将工作从运行期转移到编译期,因而得以实现早期错误侦测和更高的执行效率
TMP可以用来生成“建议与政策选择组合”的客户定制代码,也可以用来避免生成对某些特殊类型并不适合的代码。