C++模板进阶-创新互联
上面这个代码,如果我们想要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中。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
本文名称:C++模板进阶-创新互联
链接分享:http://scyanting.com/article/hddsh.html