C++显式实例化,隐式实例化,显式具体化

一、隐式实例化

 

         以下为一个简单的模板函数,例如传入的两个实参分别为int int 或者double double 时,都可执行。而实际上,函数模板只是实现函数的一种方法,并非实际的实例函数,例如当main函数中执行以下两个函数时 pt(1,2); pt(1.2,2.3);

        实际上会实例化两个函数,它们的T分别为int 和double,这是编译器帮我们做的工作,因此使用模板函数并不会缩短可执行程序,只是方便了我们对代码的编写。

        话说回来,什么是隐式实例化呢,pt(1,2)这个过程就是一个隐式实例化的过程,它实例化生成了一个T为int的函数。因此我们得知,隐式实例化实际上就是模板函数根据传入的实参类型实例化一个函数的过程。

//1、模板函数
template <class T>
void pt(T a,T b)
{
    T c = a + b;
    cout << c << endl;
}

 二、显式实例化

        上面就是隐式实例化的过程,那么显式实例化是一个什么过程呢。

        对,你猜的没错,实际上就是我们显式地写明了是何种类型

//2、显式实例化
template void pt<int> ( int a, int b);

        那你可能要问了,既然编译器自己能通过输入的实参判断来实例化这个函数模板,为什么我要自己去实例化一个呢。

        优点:1、编辑时可检查,出现错误能够及时修改

                   2、编译速度变快(我也不知道这点时间有何用。。)

三、显示具体化

        这里出现了一个与之前不同的词,具体化 而非实例化。所谓具体化,是指我对此函数做出的具体的定义。注意:具体化需要给出函数的具体实现。通过以下例子将说明。

#include<iostream>
using namespace std;

//1、模板函数
template <class T>
void pt(T a,T b)
{
    T c = a + b;
    cout << c << endl;
}
//2、显式实例化
template void pt<int> ( int a, int b);
//3、显示具体化
template <> void pt<double>(double a, double b)
{
    double c = a + b;
    cout << c << endl;
    cout << "haha" << endl;
}
int main()
{
    double a = 1.0, b = 2.2;
    pt(a, b);

    return 0;

}

        在main函数之上有三个函数,一个是模板函数,一个是显式实例化为int类型的pt,第三个就是具体化函数。

        在main函数中定义了double类型的a和b。那么调用pt时,会出现什么结果呢?注意模板函数和具体化函数实现的区别,具体化的pt还会输出haha。

             

         没错,调用的就是我们具体化的pt,还输出了haha。

四、总结

        根据以上例子我们明白了实例化以及具体化的区别,并且发现具体化的函数优先于模板函数。以下为总结。

       对于第三代具体化,C++98标准选用了下面的方法 

·        对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及他们的重载版本。

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

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

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值