C++ 模板学习记录1

  因为C++模板中有很多概念,总是容易忘记,所以学习了之后,特地总结一下,方便下次复习。

  

  1、类模板和模板类的区别

    类模板是一个关于类的模板

         模板类是类模板实例化后的实体。

    2、特化是针对模板参数更进一步的条件限制所设计出来的特化版本。

       模板全特化和偏特化,全特化是把所有模板形参进行限制。 偏特化是把部分形参进行限制。

  模板特化和偏特化后,还是一个类模板。

//Grap 为形参
template<typename Grap>
class Calculate
{
public:
    int GetGirth(const Grap& grap);    //获取周长
};

template<typename Grap>
int Calculate<Grap>::GetGirth(const Grap& grap)
{
    int iGirth = 0;
    for (int i = 0; i < grap.GetEdgeCount(); ++i)
    {
        iGirth += grap.GetEdgeLength(i);
    }
    return iGirth;
}


class Circle
{
public:
    int iR;
};

//特化,其中 Circle为实参
template<>
class Calculate<Circle>
{
public:
    int GetGirth(const Circle& grap);    //获取周长
};

//template<>        注意:不需要写这一行
int Calculate<Circle>::GetGirth(const Circle& grap)
{
    return 2 * grap.iR * 3.14;
}
View Code

      3、模板实例化

   一个通过具体值替换模板参数,从模板产生普通类、函数或者或者成员函数的过程。

   4、类模板和函数模板的区别

     a) 类模板没有自动类型推导的使用方式。

   b)类模板在模板参数列表中可以有默认参数,既可以缺省。

     c)对函数模板,只能全特化,不能偏特化。

  5、函数模板不能自动类型转换。

  void max(T a, T b);

  调用 max('a',42.6) 编译错误。

  6、函数重载可以完成代替函数偏特化

#pragma once

template<typename T1,typename T2>
void func(T1 t1, T2 t2)
{

}


#if 0
/*
不能偏特化
*/
    template<typename T2>
    void func<int,T2>(int t1, T2 t2)
    {

    }
#endif

//可以通过重载实现偏特化的效果

template<typename T2>
void func(int t1, T2 t2)
{

}
View Code

  7、类模板偏特化

#pragma once

template<typename T1,typename T2>
class D
{

};

template<typename T1>
class D<T1,int>
{

};

8、类模板的显式实例化,在未调用的时候就已经实例化了。

template<typename T>
class E
{

};

//类的显示实例化
template class E<int>;

9、函数模板的显式实例化

template<typename T>
void Fun(T t)
{

}
//函数的显式实例化
template void Fun<int>(int);
原文地址:https://www.cnblogs.com/jlyg/p/15487187.html