zoukankan      html  css  js  c++  java
  • C++ 类模板的使用

     从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距。自己连模板都没有写,于是就小小的研究了下模板的用法。

    模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结,生成一个可以处理共同部份,适应多种不同对象的方法。在C语言时代就是宏定义方法。用#define定的一个方法,不过,C时代只是对函数方法的处理,还没有对象概念,这和后来的C++函数模板一样。

     1.类模板

       请参见

       http://www.cnblogs.com/waytofall/archive/2012/06/26/2563642.html

    1.函数模板

    1.模板函数为不同的模板实参定义了一个函数家族。它的表示看起来和普通的函数很相似,唯一的区别是有些函数元素是未确定的:这些参数将在使用的时候被参数化。

    template <typename T>
    inline T const& max(T const& a,T const& b)
    {
        return a<b ? b : a; 
    }
    上述例子中的参数类型没有确定,用模板参数T来代替。
     

    2.函数模板的实例化:使用具体的类型代替模板参数的过程。这个过程产生了一个模板的实例。这个过程是在编译的时候进行的。

    模板内部的操作要被进行参数的类型所支持,否则会出错。

    在编译的时候:

    1)实例化前,先检查模板代码本身,查看语法错误等,如遗漏分号等;

    2)在实例化期间,检查模板代码,查看是不是所有的调用都有效。如该实例化类型不支持某些函数的调用。

    3.显示指定模板参数

    模板参数不支持自动类型转换,每个T都必须准确的匹配。

    template <typename T>
    inline T const7 max(T const& a, T cosnt& b);
    ...
    max(4,7)                    //OK
    max(4,4.2)                //ERROR,第一个是int,第二个是double
    有几种解决办法,
    1)max(static_cast(double)(4),4.2)   //OK
    2)显示指定模板参数:
    max<double>(4,4.2)
    3)使用连个模板参数。
     

    4.重载函数模板

    和普通函数一样,模板函数同样可以被重载,相同的函数名称可以具有不同的函数定义。

    几条基本的原则:

    1)非模板函数和一个同名的模板函数可以同时存在。对于非模板函数和同名的函数模板,如果其他条件都相同的话,在调用的时候将调用非模板函数,不会实例化模板函数。

    2)如果模板产生一个更好的匹配,选择模板参数。

    3)可以显示的指定一个空的模板实例列表,告诉编译器,用模板来匹配。

    4)函数的所有重载说明在该函数被调用位置之前。

    我现在的感觉是这个功能少用,很容易出问题,以后就不知道了。

  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/imystr/p/3912105.html
Copyright © 2011-2022 走看看