|
Chapter 1 About This Book
1.4
对于模板编程中const的使用,推荐使用 int const 而不是 const int 的风格
Chapter 2. Function Templates
2.1.2 Using the Template
函数模板要经过两遍编译:
第一遍(without instantiation):检查syntax error,例如‘;‘的丢失等
第二编(at time of instantiation):检查并确认所有的调用是有效的
这就导致了在实际使用模板时的一个问题:对一个函数模板进行实例化时,该函数模板的定义对编译器必须是可知的;这点有别对于普通函数常见的编译和连接的区别——只需要有函数的声明就足够进行编译和使用。
2.2 Argument Deduction
注意,在Argument Deduction的过程中,不允许进行自动转换
2.3 Template Parameters
函数模板有两种parameter:
1.Template parameter:出现在函数模板名称前面的"<...>"中
2.Call parameter :出现在函数模板名称后面的"(...)"中
不同于类模板,函数模板不允许拥有default template argument;这更多的是历史遗留问题而不属于技术障碍,在将来的C++标准中可能会变为允许。
sometimes ,programmer must specify the template argument explicitly because they cannot be determined through "function template argumetn deduction"
2.4 Overloading Function Templates
It is also possible to specify explicitly an empty template argument list. This syntax indicates that only templates may resolve a call, but all the template parameters should be deduced from the call arguments:
例如,max<>(7, 42) //强制在重载解析中只考虑函数模板的实例化,而不考虑同名的普通函数
通常来说,对函数模板进行重载的时候,不要对signature进行过多的改动:仅限于在参数数量或是显式指定template parameter。
Chapter 3. Class Templates
3.1.1 Declaration of Class Templates
在类模板内部,需要用到该模板类的名字时,不需要加上template parameter进行限定(例如,vector的拷贝构造函数和赋值运算符);而需要使用该模板类的类型时,则需要加上templater parameter进行限定(例如,vector的构造和析构函数)
3.2 Use of Class Template Stack
对于类模板,只有被实际调用的成员函数才会被实例化。
3.3 Specializations of Class Templates
如果对类模板进行特化的话,就必须特化所有的成员函数
3.4 Partial Specialization
类模板可以被偏特化(partial sepcializtion),但函数模板不允许
3.5 Default Template Arguments
类模板可以有default template arguments
Chapter 4. Non-type Template Parameters
对于类模板和函数模板,template parameter不一定非是类型
4.1 Non-type Class Template Parameters
每个类模板的实例都有自己独立的类型;对于Non-type Class Template Parameters,同样可以指定默认值
4.2 Non-type Function Template Parameters
4.3 Restrictions for Nontype Template Parameters
可以用于nontype template parameters的值包括: 常量整数类型值,或者是指向external linkage 对象的指针。
浮点值和类不允许用作nontype template parameters
string literals 是具有internal linkage的对象(即,两个TU中同样的string literal
在各自的module独立存在)
Chapter 5. Tricky Basics
5.1 Keyword typename
当要使用某个限定(qualified)从属(dependent)名称时,必须要前加typename,用于告诉编译器,后面的名字是个类型
The .template Construct
当对一个依赖于template parameter的对象使用'.'运算符时,要在'.'后面加上'template'
5.2 Using this->
若某个类派生自模板类,在其成员函数中调用基类函数时,最好显式的在函数名前加上'this->'
5.3 Member Templates
类成员也可以是模板,这点对于内部类和成员函数都是成立的
类中的模板赋值运算符不会替代默认的赋值运算符,当发生相同类型之间的赋值时,仍会调用默认的赋值运算符
5.4 Template Template Parameters
这里需要注意的问题是Template Tempalte Parameter的实参类型必须和形参完全一致
Template Template Parameters是C++标注中较新加入的内容
5.5 Zero Initialization
T x = T();
5.6 Using String Literals as Arguments for Function Templates
string literal的类型是和其长度相关的,例如“apple"的类型为const char[6],"banana"的类型为const char[7]
当string literal通过引用方式传给函数模板时,函数模板得到的类型为const char[x];而只有当string literal通过值方式传给函数模板是,才会发生array-to-pointer的decay,函数模板得到的类型为const char *
Chapter 6. Using Templates in Practice
6.1 The Inclusion Model
(通常的)代码组织惯用法:
1.类和其他类型的完整信息保存在头文件中
2.对于全局变量和non-inline functions,头文件中只包含其声明,定义放入另外一个.cpp文件中(该文件又包含前面那个头文件)
如果对于模板采用第二种方式的话,编译的时候通常不会出问题,然而却无法通过连接:连接起找不到函数(实例)相应的定义。
要正确是对一个模板进行实例化,编译器必须同时了解模板的定义和用于实例化的类型参数;在前面的组织方式中,这两个信息被分离了,编译器无法同时获取两者。
inclusion model导致的代价:
1.模板的使用方现在不仅将模板包含进来,还要将模板所依赖的头文件也包进来,这会极大的膨胀源代码的规模,进而延长编译时间。
2.对于non-inline function template,可能会导致编译器在不同的两个TU中生成相同的函数模板实例,这样在连接时可能会报错
6.2 Explicit Instantiation
Explicit Instantiation Directive
6.2.2 Combining the Inclusion Model and Explicit Instantiation
提供两套头文件(实现一套、声明一套),分别用于Inclusion Model和Explicit Instantiation
6.3 The Separation Model
常见的误解是export机制有助于隐藏模板的实现代码,就像普通函数提供头文件和二进制目标文件一样。
不,export的目的不在与此
6.4 Templates and inline
不要因为function template的实现通常放在头文件中,就误解function template默认为internal linkage
6.5 Precompiled Headers
某些C++标准委员会的成员认为如std.hpp这样的Precompiled Headers很有价值,建议将其加入标注,成为标准头文件
6.6 Debugging Templates
Chapter 7. Basic Template Terminology
7.1 "Class Template" or "Template Class"?
use "class template", avoid "template class"
use "fucntion template",avoid "template function"
member function template
7.2 Instantiation and Specialization
Instantiation: The process of producing Specialization
Sepcialization: The resuling entity of Instantiation process
然而,Instantiation并不是产生Specialization的唯一途径
Primary template
7.4 The One-Definition Rule(ODR)
1.non-inline function和 member function 以及全局变量和静态类成员在整个程序中应该只在一处定义;
2.class(以及struct和Union)和inline function在每个TU中被定义最多一次,并且所有的定义应该是一致的
7.5 Template Arguments versus Template Parameters
the combination of template name,followed by the arguments in angle brackets,is called a template-id
arguments -> actual parameters
parameter -> formal parameters
一条基本规则:template argument必须是编译期可确定的量或值
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovekatherine/archive/2008/03/06/2152846.aspx |
|