zoukankan      html  css  js  c++  java
  • 模板

      模板:类模板和函数模板。

      一、模板实参推断:

        定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断。

        1、多个类型形参的实参必须完全匹配。

        template <typename T>

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

        {

          if(v1 < v2) return 1;

          else return 0;

        }

        int main()

        {

          short s;

          compare(s,1024);//error

        }

        这里是错误的,因为调用comare时的实参类型不相同。第一个实参推断出的模板类型是short,第二个是int,类型不匹配,所以模板实参推断失败。

        如果想要允许实参的常规转换,函数必须用两个类型形参来定义:

        template <typename A, typename B>

        int compare(const A& vi, const B& v2)。。。

        

        2、类型形参的实参的受限转换。

        一般不会转换实参以匹配已有的实例化,会产生新的实例。

        编译器只会接受两种转换:

          const转换:接受const引用或const指针的函数,可以分别用非const对象的引用和指针来调用,无须产生新的实例化。如果函数接受非引用类型,形                 参类型和实参都忽略const。即,无论传递const或非const对象给接受非引用类型的函数,都使用相同的实例化。

          数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指针转换。数组实参将当做指向其第一个元素的指针,

        函数实参当做指向函数类型的指针。

        3、应用于非模板实参的常规转换

        用普通类型定义的形参可以使用常规转换。

        4、模板实参推断与函数指针

        可以使用函数模板对函数指针进行初始化和复制,这样做时,编译器使用指针的类型实例化具有适当模板形参的模板版本。

        如下:

        template <typename T>

        int compare(const T& , const T&);

        type int (*pf) (const int& a, const int& b) fun;

        fun t = compare.

        t的类型是函数指针,指向“接受两个const int&类型形参并返回int值得函数”,形参的类型决定了T的模板实参的类型。指针t的引用是将T绑定到int的实

        例化。

        如果不能从函数指针类型确定模板实参,就会报错。

        void func(int (*) (const string&,const string&);

        void func(int (*) (const int&,const int&);

        func(compare)//报错。

        问题在于,通过查看func的形参类型不可能确定模板实参的唯一类型,对func的调用可以实例化下列函数中的任意一个,

        compare(const string&,const string&);

        compare(const int &,const int &);

        因为不能为传给func的实参确定唯一的实例,所以出错。

      二、函数模板的显式实参

        1、在返回类型中使用类型形参

        compare<string,string>(a,b);

        2、显示实参与函数模板指针

        可以使用显示模板实参消除二义性。

        func(compare<int>);//ok.

  • 相关阅读:
    内核参数优化/etc/sysctl.conf
    python
    2014又一次认识我
    Android核心服务解析篇(三)——Android系统的启动
    Cocos2d-x 3.0 Android改动APK名、更改图标、改动屏幕方向、改动版本,一些须要注意的问题
    算术表达式
    数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )
    交叉排序
    iOS AES的加密解密
    codeforces 570 D Tree Requests
  • 原文地址:https://www.cnblogs.com/lverson/p/3281684.html
Copyright © 2011-2022 走看看