模板简单认识

模板简单认识

函数模板与类模板

函数模板的实例化

隐式实例化:让编译器根据实参推演模板参数的实际类型

template<class T>
T Add(const T& left, const T& right)
{
    return left + right;
}

int main()
{
    int a1 = 10, a2 = 20;
    double d1 = 10.0, d2 = 20.0;
    Add(a1, a2);
    Add(d1, d2);
    return 0;
}

但是如果你想这样是不可以的:编译器会无法确定此处到底该将T确定为int 或者 double类型而报错

Add(a1,d1);

我们可以这样解决:将其强制转为同一类型

 Add((double)a1, d1);

显式实例化:在函数名后的<>中指定模板参数的实际类型

int main()
{
    int a = 10;
    double b = 20.0;
  
    // 显式实例化
    Add<int>(a, b);
    return 0;
}

当然,实例化这里还有一些其他的玩法:

template<class T1, class T2>//比如可以有两个模板参数来实例化
T1 Add(T1 left, T2 right)
{
    return left + right;
}

void Test()
{
    Add(1, 2);    
    Add(1, 2.0);  
    
}
template<class T1=char, class T2=int>//可以跟函数参数一样给缺省值 
T1 Add(T1 left, T2 right)
{
    return left + right;
}

可以发现其实模板参数和函数参数非常像,只不过函数参数给的是参数值,模板参数给的是参数类型

匹配原则

一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
}; 

模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生

比如vector:

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值