第十六章 模板与泛型编程(略过很多部分)

    技术2025-02-11  43

    16.1 模板定义

    1) 例子:

    template <typename T>

    inline int compare(const T& v1,const T& v2)

    {

             if(v1<v2) return -1;

             if(v1>v2) return -1;

             return 0;

    }

    2) typename class是一样的

     

    3) 在模板定义内部指定类型

    template<class Param,class U>

    Param fcn(Param * array,U value)

    {

             Param::size_type *p;//这个时候编译器默认size_type是成员变量而不是类型

             typename Param::size_type *p;//OK,这个时候是类型的意思

    }

    4) 非类型也可以作为模板形参

    例子:

    template<class T,size_t N>

    void array_init(T (&parm)[N])

    {

             for(size_t i=0 ; i!=N;++i)

                       parm[i]=0;

    }

     

    int x[10];

    int y[100];

    array_init(x);//自动引用实例array_init<int,42>

    array_init(y);//同上

    16.2 实例化

    1) 类模板形参是必须的,类型匹配必须完全匹配

     

    2) 使用函数模板的时候,编译器通常会为我们推断模板实参

     

    3) 函数指针的实例化

    template<class T>

    int compare(const T&,const T&)

    {

    }

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

    16.3 模板编译类型

    关于export一般不要用

    16.6 模板特化

    1) 函数

    template<>

    int compare <const char *>(const char * const &v1,const char *const v2)

    {

    return strcmp(v1,v2);

    }

    //这样在调用compare模板的时候,如果传入的参数是char *,那么就会用这个特例化的模板,而不是通用模板.

     

    2) 可以对类特化,也可以只对类的成员特化

    16.7 重载与函数模板

    1) 首先考虑普通函数,其次考虑模板函数.首先考虑不需要隐式类型转换的函数,其次考虑需要隐式类型转换的函数

     

    最新回复(0)