c++特例化和实例化

关于c++的特例化和实例化,这两个名词的名字就差不多,含义也容易被搞混,其实两者差别还是比较大的。
实例化(instantiation):
模板在调用之前都没有生成真正的代码,调用之后才会生成代码,这个生成代码的过程就叫做实例化,实例化是老老实实,原封不动地实例化的,比如:

//**模板函数实例化**
template<typename T>void print(T obj){
    cout<<obj;
}//普通模板函数

template void print(int)//模板函数显示实例化定义

int a=2;//模板函数显示实例化
//第一种方式是声明所需的种类,用<>符号来指示类型,并在声明前加上关键词template,如下:
template void Swap<int>(int &, int &);

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

Swap<int>(a,b);

ptint(a);//模板函数隐式实例化

//**类模板实例化**
template<typename T>class goods{
    T a;
}//普通模板类

template class goods<int>;//模板类显示实例化定义

goods<int> boxs;//模板类显示实例化

特例化(specialization):
特例化就是针对特定类型更改内部逻辑之后再实例化,当然,如果你比较老实,你也可以不改任何东西,比如:

//**模板函数特例化**
template<typename T>void print(T obj){
    cout<<obj;
}//普通模板函数
template<>void print(vector<int> obj){
    for(auto i:obj){
        cout<<i<<endl;
    }
}//模板函数特例版本,对int版本进行特例化,改变了内部逻辑结构,no problem

//**模板类特例化**
template<typename T>class goods{
    T a;
}//普通模板类
template<>class goods<int>{
    int a;
    int b;
    int get(){
        return a;
    }
}//模板类特例化版本,增加了一个成员变量,一个成员函数,no problem

这里针对vector<int>类型版本进行了特例化,对于该类型的输出方式变成了循环输出。逻辑发生变更,且顺便将模板实例出了代码。
偏特化
至于偏特化嘛,偏特化后本质上还是个模板,所以这东西只存在于模板类中,因为对于模板函数有重载机制,与其偏特化出个特殊模板,还不如重载个模板,所以编译器干脆不支持模板函数的偏特化。

template <typename T> class A{
    T a;
}//普通模板类
A<int*>obj;
obj.a;//int*类型

template <typename T>class A<T*>{
    T a;
    T b;
}//模板类偏特化版本,本质上还是个模板,所以模板参数列表还有个T。
A<int*>obj;
obj.a;//int类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值