https://blog.csdn.net/qq_30835655/article/details/76850894

函数模板是C++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度,同时也便于修改。但是,在代码中包含函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例(instantiation)。

1 实例化

实例化有两种形式,分别为显式实例化和隐式实例化。模板并非函数定义,实例式函数定义。
1.1 显式实例化(explicit instantiation)

显式实例化意味着可以直接命令编译器创建特定的实例,有两种显式声明的方式。

比如存在这么一个模板函数

template <typename T>
void Swap(T &a, T &b)

第一种方式是声明所需的种类,用<>符号来指示类型,并在声明前加上关键词template,如下:
template void Swap<int>(int &, int &);

第二种方式是直接在程序中使用函数创建,如下:

Swap<int>(a,b);

显式实例化直接使用了具体的函数定义,而不是让程序去自动判断。
1.2 隐式实例化(implicit instantiation)

隐式实例化比较简单,就是最正常的调用,Swap(a,b),直接导致程序生成一个Swap()的实例,该实例使用的类型即参数a和b的类型,编译器根据参数来定义函数实例。

2 具象化(显式)
思考这么一个问题,当前的Swap模板交换输入的两个对象,可能式基本类型也可能式自定义类。如果有这么一个需求,需要交换自定义类里的某一个属性而不是整个类,那么Swap模板就不可用,因为Swap模板交换的是整个类。
显式具体化将不会使用Swap()模板来生成函数定义,而应使用专门为该特定类型显式定义的函数类型。有两种定义形式,如下,其中job为用户自定义类
template <> void Swap(job &a, job &b)
template <> void Swap<job>(job &a, job &b)
显式具体化在声明后,必须要有具体的实现,这是与显示实例化不同的地方。

3 举例
下面通过一个程序来观察实例化和具体化,加深理解。

/*************************************************************************
        > File Name: array.cpp
        > Author:
        > Mail:
        > Created Time: Sat 05 Aug 2017 01:20:31 AM PDT
     ************************************************************************/
     
    #include<iostream>
    #include<string>
    using namespace std;
     
    struct job
    {
        string name;
        int salary;
        job(string _name,int _salary):name(_name),salary(_salary){};
    };
     
    //template prototype
    template <typename T>
    void Swap(T &a, T &b){
        T temp;
        temp = a;
        a = b;
        b = temp;
    }
     
    //explict specialization for job 显式具体化
    template <> void Swap(job &a, job &b)
    {
        int temp;
        temp = a.salary;
        a.salary = b.salary;
        b.salary = temp;
    }
     
    template void Swap<int>(int &, int &);
    int main()
    {
        char a = 'a', b = 'b';
        cout<<"a: "<<a<<" ; b: "<<b<<endl;
        Swap(a,b);  //1 implicit template instantiation for char 隐式实例化
        cout<<"a: "<<a<<" ; b: "<<b<<endl;
     
        int c = 1, d = 2;
        cout<<"c: "<<c<<" ; d: "<<d<<endl;
        Swap(c,d);  //2 use explicit template instantiation for int 显式实例化
        cout<<"c: "<<c<<" ; d: "<<d<<endl;
       
        Swap<int>(c,d);  //3 use explict template instantiation for int 显式实例化
        cout<<"c: "<<c<<" ; d: "<<d<<endl;
        
        job e("lucy",100), f("bob",200);
        cout<<"lucy: "<<e.name<<" "<<e.salary<<" ; bob: "<<f.name<<" "<<f.salary<<endl;
        Swap(e,f);  //use explict specialization for job 调用显式具体化
        cout<<"lucy: "<<e.name<<" "<<e.salary<<" ; bob: "<<f.name<<" "<<f.salary<<endl;
    }

输出

➜  cpptest ./a.out      
    a: a ; b: b
    a: b ; b: a
    c: 1 ; d: 2
    c: 2 ; d: 1
    c: 1 ; d: 2
    lucy: lucy 100 ; bob: bob 200
    lucy: lucy 200 ; bob: bob 100

备注:隐式实例化和显式实例化和显式具体化统称为具体化,它们的相同在于都用了具体类型的函数定义,而不是通用描述。
---------------------  
作者:尹小贱  
来源:CSDN  
原文:https://blog.csdn.net/qq_30835655/article/details/76850894  
版权声明:本文为博主原创文章,转载请附上博文链接!

C++ 函数模板 实例化和具体化相关推荐

  1. c++中函数模板的显示具体化

    函数模板的显示具体化. 函数模板存在局限性,当定义函数模板时,我们始终假定函数体中的语句是合法的.例如定义如下函数模板: template <typename T> T add(T x, ...

  2. C++函数申明对函数模板实例化的屏蔽

    1.C++函数匹配顺序 C++语言引入模板机制后,函数调用的情形显的比C语言要复杂.当发生一次函数调用时,如果存在多个同名函数,则C++编译器将按照如下的顺序寻找对应的函数定义. (1)寻找一个参数完 ...

  3. 【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板

      ​​​​​​         

  4. C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则

    文章目录 泛型编程 函数模板 函数模板实例化 隐式实例化 显式实例化 函数模板的匹配规则 类模板 类模板的实例化 泛型编程 泛型编程旨在削减重复工作,如: 将一个函数多次重载不如将他写成泛型. voi ...

  5. c++函数模板(c++细节篇十)

    函数模板 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法: template <typename 标识符> 函数声明. 例子: #i ...

  6. C++ 模板的显示具体化

    C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板.但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误. 例如有下面的函数 ...

  7. C++ 函数模板和排序的函数模板——学习笔记

    我们在使用重载函数时,只是使用了函数名,而函数体还是得分别定义,在C++中函数模板为我们很好的解决了这个问题. 1.函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函 ...

  8. [转]C++函数模板与模板函数

    1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板 ...

  9. c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板

    本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...

  10. c++模板之函数模板

    函数模板 函数模板的定义格式如下: **template <模板参数> 类型说明符 函数名 (参数列表) { 函数体: } ** 例如: template <typename T&g ...

最新文章

  1. 前端面试问题(HTML5+Http+web)
  2. Scala集合:Map集合
  3. C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
  4. python之美_Python之美[从菜鸟到高手]--生成器之全景分析
  5. 腾讯信息流推荐业务实践:内容分发场景的多目标架构实践
  6. vue从创建到完整的饿了么(10)city.vue的完善(v-if 的简单使用及本地缓存的存储与读取)...
  7. 遗传算法经典实例代码_利用遗传算法优化GANs
  8. SVN Server使用说明
  9. 用emoji表情提交代码指南
  10. 理论+实验:LAMP网站服务器部署(超详细版本)
  11. saas系统服务器搭建,SaaS平台部署.doc
  12. c语言怎样控制键盘的方向键,c++怎么获取键盘的方向键
  13. 2022第七届“数维杯”大学生数学建模夏令营
  14. 【html】svg标签
  15. hdu4745(最长回文子序列)
  16. 数据中台Citus集群压测报告
  17. 小程序scroll-view 设置scroll-y=false 不管用的问题
  18. Java项目管理系统 的设计与实现
  19. 基于python django框架的物联网平台即将开源,兼具IoT物联网平台和IBMS系统集成平台双重特性
  20. 快手直播前期怎么引流?快手新人主播怎么做涨粉

热门文章

  1. 对称矩阵特征向量正交推导
  2. 程序员技术入股的那些坑
  3. 特此感谢!酷睿12、希捷硬盘、机械键盘……免费送大家
  4. 广义表的存储结构及其基本运算
  5. julia java_Julia和Java性能比较
  6. 2010-2019中国企业所有跨国并购数据
  7. 支持linux的代码审计,linux驱动代码审计经验谈
  8. 一个猫下面的计算机互相访问,光猫连接路由器和电脑如何互相访问
  9. 1588 1-Step 和 2-Step PTP 之间有什么区别?
  10. 【Python实例学习】用Python的xlsxwriter模块操作Excel表格,包括写入数据、样式设置、插入图片等