C++ primer->16.1 定义模板

一、

  1、当我们调用一个函数模板时,编译器用函数实参来为我们推断模板实参

  2、模板实参的作用:指定返回类型或函数的参数类型,以及在函数体内用于变量的声明或类型转换。

  3、除了定义类型参数,还可以在模板中定义非类型参数,一个非类型参数表示一个值而非一个类型。

二、

  1、与函数模板不同的是,编译器不能为类模板推断模板参数类型,必须显示提供。

  2、类模板中,如果一个成员函数没有被使用,则它不会被实例化,成员函数只有在被用到时才进行实例化。

  3、在类模板自己的作用域中,我们可以直接使用模板名而不提供实参。(PS:由于返回类型位于类的作用域之外,我们必须指出实例化的模板名)。

 

二*、类与友元

  1、模板类和非模板友元:友元可以访问所以模板实例。

  2、模板类和模板友元:类可以授权给所有友元模板实例,也可以只授权给特定实例。

  3、当一个模板所有实例都被声明为友元时,这种情况无须前置声明;其它情况则需要前置声明。

  

template<typename T> class Pal;
class C
{
    friend class Pal<C>;//并不是所有实例,所以要前置
    template<typename T> friend class Pal2;//所有实例,所以不需
//要前置
}

  4、令模板自己的类型参数作为自己的友元、模板类型别名、类模板的static成员

 三、模板参数

  1、类的类型成员:我们用作用域运算符(::)来访问static成员和类型成员,在普通模板中,编译器掌握类的定义,所有它清晰自己的成员。但是在模板中,必须在实例化之后才知道,所以我们不能通过以往的方式。默认情况下,C++语言假定通过作用域运算符访问的名字不是类型。因此,如果我们希望使用一个模板类型参数的类型成员,通过typename来显示告知。

template <typename T>
typename T::value_type top(const T& c)
{
    if(!c.empty())
        return c.back();
    else
        return typename T::value_type();
}

 

 四、

  1、shared_ptr在运行时绑定删除器,所有不是通过对象直接设定,必须加了一层间接性。而unique_ptr采用对象存取方式,在编译时设定,采用对象保存。

  

posted @ 2016-08-22 14:55  潇少爷  阅读(199)  评论(0编辑  收藏  举报