41、了解隐式接口与编译期多态
42、了解typename的双重意义
43、学习处理模版化基类内的名称
- 概念:模版全特化(total template specialization)P239
- 命令C++“不进入template base classes 观察”的行为失效。的三个办法:
1 、在base class 函数调用之前加上"this ->"
2、使用using声明式。
3、明白指出被调用的函数位于base classes内部。(但是若被调用的函数是virtual函数,上述明确资格修饰(explicit qualification)会关闭"virtual绑定行为")
44、将参数无关的代码抽离templates
请记住:
1、Templates生成多个classes和多个函数,所以任何templates代码都不应该与某个造成膨胀的template参数产生依存关系。
2、非类型模版参数(non-type template parameters)造成的代码膨胀,往往可以消除,做法是以函数参数或classes成员变量替换template参数。
3、类型参数(type paramters)造成的函数代码膨胀,往往可以降低,做法是让带有完全相同的二进制表述(binary representations)的具现类型(instantiation types)共享实现码。
45、运用成员函数模版接受所有兼容类型
- 所谓智能指针(Smart pointers)是行为像指针的对象,并提供指针没有的机能。STL容器的迭代器几乎和从时智能指针。
- 真实指针可以:支持隐式转换。派生类指针可以隐式转换为基类指针,“指向non-const对象”的指针可以转换为“指向const对象”。
- 请记住:
1、请使用member function templates(成员函数模版)
生成“可接受所有兼容类型”的函数。
2、如果你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assognment操作符。
46、需要类型转换时,请为模版定义非成员函数(Define non-member functions inside templates when type conversions are desired)
- 当我们编写一个class template,而它所提供之“与此tamplate相关的”函数支持“所有参数之隐式转换时”,请将那写函数定义为“class template 内部的friend函数”。
47、 请使用traits classes 表现类型信息
- STL迭代器分五类。
- Traits classes 是的“类型相关信息”在编译期间可用。他们以templates和templates 特列化实现。
- 整合重载技术(overloading)后,traits classes有可能在编译期对类i小那个执行if..else测试。
48、认识template元编
#include <iostream>
using namespace std;
template<unsigned n>
struct Factorial{
enum {value = n *Factorial<n-1>::value};
};
template<>
struct Factorial<0>{
enum {value = 1};
};
int main()
{
cout << "Hello World" << endl;
cout << Factorial<5>::value ;
return 0;
}