C++ primer 第十六章

1.      模板定义以template开始,后接模板形参表(<>),模板形参表不能为空。

2.      模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。

3.      函数模板可以用与非函数模板函数一样的方式声明为inline,inline说明符放在模板形参表之后、返回类型之前。

4.      在函数模板形参表中,关键字typename和class具有相同含义,可以互换使用。

5.      编写泛型代码的两个重要原则:

模板的形参是const引用。

函数体中的测试只用<来比较。

6.      可以使用函数模板对函数指针进行初始化或赋值。这么做的时候,编译器使用指针的类型实例化具有适当模板实参的模板版本。

template <typename T>

 int compare(const T&, const T&);

int (*pf1) (const int&,const int&)=compare;

pf1是一个函数指针,指向一个接受两个constint&形参并返回int值的函数。

7.      可以显式调用模板实参。在函数名之后,实参表之前加<>表示的实参列表。

8.      编译类型:包含编译类型、分别编译类型。

export关键字:

9.      类模板成员函数的定义:

template <class T>

 ret-type Class_Name<T>::member-name(…)

类模板成员函数只有在为程序所用的时候,才进行实例化,如果从未使用,则不会实例化。

当成员函数也是模板时,它的定义必须包含类模板形参以及自己的模板形参。首先是类模板形参表,然后是成员自己的模板形参表。

template <class T1> 

template <class T2> 

ret-type Class_Name<T1>::member-name(…)

10.  编译器会将友元声明也作为类或函数的声明来对待。

11.  模板特化:该模板定义中一个或多个模板形参的实际类型或实际值是指定的。定义格式如下:

template 后接一堆空尖括号,再接函数名和尖括号,该尖括号中指定特化的模板形参,然后是函数名和函数体。

template <>

ret-type foo<type A>(…){}

模板特化也可以声明而不定义。

如果程序由多个文件构成,则模板特化的声明必须在使用该特化的每个文件中出现。可以将声明包含在头文件中。

12.  类模板特化可以定义与模板本身完全不同的成员。

13.  在类特化外部定义成员时,成员之前不能加template<>标记。

14.  类模板的部分特化,只特化部分形参:

template<不特化的形参列表>

class Class_Name<不特化和特化的形参列表>{…}

部分特化的定义与通用模板的定义完全不会冲突。部分特化可以具有与通用类模板完全不同的成员集合。

15.  函数模板可以重载,可以定义有相同名字,但形参数目或类型不同的多个函数模板。也可以定义与函数模板有相同名字的普通非模板函数。

16.  如果有二义性,普通函数的优先级大于模板函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值