C++模板进阶-创新互联

创新互联建站主营安新网站建设的网络公司,主营网站建设方案,成都app软件开发公司,安新h5成都微信小程序搭建,安新网站营销推广欢迎安新等地区企业咨询

上面这个代码,如果我们想要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