找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6132|回复: 1

C++ Template:The Complete Guide

[复制链接]
发表于 2009-7-24 21:07:42 | 显示全部楼层 |阅读模式
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
发表于 2009-9-13 22:31:35 | 显示全部楼层
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 17:38 , Processed in 0.016460 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表