首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实例化和具体化详解

实例化和具体化详解

作者头像
lpxxn
发布2018-01-31 12:54:29
6270
发布2018-01-31 12:54:29
举报
文章被收录于专栏:技术之路技术之路

primer Plus在解释具体化和实例化看的有点乱,分解出来备忘

在代码中包含函数模板本身并不会生成函数定义,它只是用于生成函数定义的方案

编译器使用模板为我写类型生成函数定义时,得到的是模板实例

如这个模板

template<typename T>
void Swap(T &t1,T &t2)
{
    T _t;
    _t=t1;    
    t1=t2;
    t2=_t;
}

调用

    int i = 10,j=20;
    ::cout<<"i, j ="<<i<<" , "<<j<<endl;
    cout<<" Using compiler -generated int swapper:\n";
    Swap(i,j);
    ::cout<<"Now i, j ="<<i<<" , "<<j<<endl;

调用 Swap(i,j)导致编译器生成Swap()的一个实例,该实例使用int类型。模板并非函数定义,但使用int的模板实例是函数定义。 这种实例化方式被称为隐式实例化,编译器之所以知道需要进行定义,是由于程序调用Swap()函数时提供了int 参数。

c++还允许显示实例化

其语法是,声明所需的种类用<>指示类型并在声明前加上template:

template void Swap<int>(int &t1,int &t2);

例子

#include<iostream>
using namespace std;

template<typename T>
void Swap(T &t1,T &t2);

template void Swap<int>(int &t1,int &t2);

int main()
{
    cout<<" Using compiler -generated int swapper:\n";
    int i = 10,j=20;
    cout<<"i, j ="<<i<<" , "<<j<<endl;    
    cout<<" Using compiler -generated int swapper:\n";
    Swap(i,j);
    cout<<"Now i, j ="<<i<<" , "<<j<<endl;    
    cin.get();
}

template<typename T>
void Swap(T &t1,T &t2)
{
    T _t;
    _t=t1;    
    t1=t2;
    t2=_t;
}

显示具体化的原型和定义应以template<>打头,并通过名称来指出类型。

显式具体化优先于常规模板,而非模板函数优先于具体化和常规模板

与显式实例化不同的是,显式具体化使用下面的声明方式 ,两种方式是一样的

template<> void Swap<job>(job &c1,job &c2);
template<> void Swap(job &c1,job &c2);

这们的意思是不要使用Swap()模板来生成函数定义,而使用专门的job类型显式地定义函数定义 显式具体化声明在关键字template 后加<>,显式实例化没有

具体化小例子

#include<iostream>
using namespace std;

struct job
{
    char name[40];
    double salary;
    int floor;
};
template<typename T>
void Swap(T &t1,T &t2);
template<> void Swap<job>(job &c1,job &c2);

void show(job j);
int main()
{
    

    job sue={"Suan Yaffee",73000.123,7};
    job sidey={"Sidney Taffee",78060.1,2};
    cout<<"sue:\n";
    show(sue);
    cout<<"sidey:\n";
    show(sidey);
    Swap(sue,sidey);
    cout<<"sue:\n";
    show(sue);
    cout<<"sidey:\n";
    show(sidey);
    cin.get();
}

template<typename T>
void Swap(T &t1,T &t2)
{
    T _t;
    _t=t1;    
    t1=t2;
    t2=_t;
}

template<> void Swap<job>(job &j1,job &j2)
{
    double t1;
    int t2;
    t1 = j1.salary;
    j1.salary=j2.salary;
    j2.salary=t1;

    t2=j1.floor;
    j1.floor=j2.floor;
    j2.floor=t2;
}
void show(job j)
{
    cout<<"name :"<<j.name<<"  salary:  "<<j.salary<<" floor :  "<<j.floor<<endl;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档