C++模板进阶

文章探讨了C++中的非类型模板参数,如在数组操作中的应用,强调其在边界检查中的优势。接着介绍了函数模板特化和类模板的特化与偏特化,解释了如何针对特定类型进行定制。文章还讨论了模板分离编译的问题,指出将模板声明和定义放在头文件中以解决链接错误的原因。
摘要由CSDN通过智能技术生成

 上面这个代码,如果我们想要a1中数组为10,a2中数组为100用宏来操作是做不到的。

 这样改就可以了。其中N是非类型模板参数,是个常量。

array就是一个非类型模板参数。 

array - C++ Reference (cplusplus.com)

 它没有push_back之类的接口。因为N已经提前给好。

它通过[]对数据进行操作。

这个非类型模板参数有什么用?

数组对于越界读取不检查,对于越界写入是抽查。

而array就能随时检查越界,因为它是函数重载,参数能随时检查是否小于N。 

 非类型模板参数是整形常量,基本上只适用于整形。

函数也可以用非理性模板参数。

非类型模板参数一般是整形,int short size_t, 浮点数,自定义类型都不行,而且必须是常量。

 

  • 函数模板特化。 

同名的函数模板和普通函数可以同时存在,如果其它条件都相同,调用的时候优先调用普通函数,模板就不会产生对应的实例,如果模板可以产生一个更好匹配的函数,那么就会选择模板,如果模板产生了和普通函数的实例,则是重载的,如果需要调用的参数类型,和普通函数匹配,则函数模板不会实例化生成对应的函数。如果类型不一致,则会生成对应具体的函数,此时生成的函数和原有的普通函数形成重载(函数参数的类型不同)。

特化即特殊化即针对某些类型进行特殊处理,比如说日期类的地址。

特化出来的是函数,不是模板。

 

这样就能比较日期类的地址了。 

 

 下面这个,虽然两个函数名相同,但是底下的实例化后,和模板构成重载,上图这样调用也是可以的。

  •  类的特化

 

 

 

  •  偏特化

 

 

d3,d4会优先选择偏特化。

 

 

 

 特化本质体现编译器参数匹配原则,有现成的找现成的,有半成品找半成品,什么都没有就自己造。

  • 模板分离编译

a.h

a.cpp

 main.cpp

 a.cpp中模板在编译阶段看不懂main.cpp中的代码,不知道是否会被调用,就不会实例化,链接阶段main.cpp中就找不到Add函数的地址,就会出错。

将声明和定义放到一个文件 a.h。可以解决问题。

因为放到.h是因为预处理时.h在.cpp中展开了,模板看到被调用了,就能实例化,链接就能找到了。

.h文件是相当于预处理时在.cpp文件中展开,就相当于代码直接写在了.cpp中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南种北李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值