首页 > 作文

C++初阶学习之模板进阶

更新时间:2023-04-04 15:25:18 阅读: 评论:0

目录
一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结总结

一、非模板类型参数

分类:

模板参数分类类型形参与非类型形参

概念:

1.类型形参:

出现在模板参数列表中,跟在class或者typename之类的参数类型名称

2.非类型形参:

用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

示例:

namespace cole{// 定义一个模板类型的静态数组template<class t, size_t n = 10>class array{public:t& operator[](size_t index) { return _array[index]; }const t& operator[](size_t index)const { return _array[index]; }size_t size()const { return _size; }bool empty()const { return 0 == _size; }private:t _array[n];size_t _size;};}

注意:

1.浮点数、类对象以及字符串是不允许作为非类型模板参数的

2.非类型的模板参数必须在编译期就能确认结果

二、模板特化

概念:

使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果

示例:

template<class t>bool iqual(const t& left, const t& right){return left == right;}/电力知识/ 函数模板的特化 (针对某些类型的特殊化处理)//bool iqual(const char* const & left,const char* const & right)bool iqual(const char* left, const char* right){return strcmp(left, right) == 0;}int main(){cout << iqual(1, 2) << endl;char p1[] = "hello";char p2[] = "hello";cout << iqual(p1, p2) << endl;;return 0;}

特殊化结果:

不做特殊化结果:

注:此时对于字符串比较就需要对模板进行特化(在原模板类的基础上,针对特殊类型所进行特殊化的实现方式)

特化分类:

函数模板特化类模板特化

1、函数模板特化

函数模板的特化步骤:

必须要先有一个基础的函数模板关键字template后面接一对空的尖括号<>函数名后跟一对尖括号,尖括号中指定需要特化的类型函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不草帽计同编译器可能会报一些奇怪的错误

示例:

template<class t>bool iqual(const t left, const t right){return left == right;}template<>bool iqual<char*>(char* left,char* right){if (strcmp(left, right) == 0)return true;return fal;}

结果:

注:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出

示例:

bool iqual(char* left, char* right){if (strcmp(left, right) == 0)return true;return fal;}

2、类模板特化

1)全特化

概念:

全特化即是将模板参数列表中所有的参数都确定化

示例:

template<class t1, class t2>class data{public:data() { cout << "data<t1, t2>" << endl; }private:t1 _d1;t2 _d2;};template<>class data<int, char>{public:data() { cout << "data<int, char>" &l平安夜快乐的祝福图片t;< endl; }private:int _d1;char _d2;};void testvector(){data<int, int> d1;data<int, char> d2;}

2)偏特化

概念:

任何针对模版参数进一步进行条件限制设计的特化版本

偏特化有以下两种表现方式:

1.部分特化

将模板参数类表中的一部分参数特化

示例:

// 将第二个参数特化为inttemplate <class t1>class data<t1, int>{public:data() { cout << "data<t1, int>" << endl; }private:t1 _d1;int _d2;};// 将第二个参数特化为inttemplate <class t1>class data<t1, int>{public:data() { cout << "data<t1, int>" << endl; }private:t1 _d1;int _d2;};

2.参数更进一步的限制

偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本

示例:

//两个参数偏特化为指针类型template <typename t1, typename t2>class data <t1*, t2*>{public:data() { cout << "data<t1*, t2*>" << endl; }private:t1 _d1;t2 _d2;};//两个参数偏特化为引用类型template <typename t1, typename t2>class data <t1&, t2&>{public:data(const t1& d1, const t2& d2): _d1(d1), _d2(d2){cout << "data<t1&, t2&>" << endl;}private:const t1& _d1;const t2& _d2;};void test2(){dat什么叫声母a<double, int> d1; // 调用特化的int版本data<int, double> d2; // 调用基础的模板data<int*, int*> d3; // 调用特化的指针版本data<int&, int&> d4(1, 2); // 调用特化的指针版本}//两个参数偏特化为指针类型template <typename t1, typename t2>class data <t1*, t2*>{public:data() { cout << "data<t1*, t2*>" << endl; }priv滁州学院官网首页ate:t1 _d1;t2 _d2;};//两个参数偏特化为引用类型template <typename t1, typename t2>class data <t1&, t2&>{public:data(const t1& d1, const t2& d2): _d1(d1), _d2(d2){cout << "data<t1&, t2&>" << endl;}private:const t1& _d1;const t2& _d2;};void test2(){data<double, int> d1; // 调用特化的int版本data<int, double> d2; // 调用基础的模板data<int*, int*> d3; // 调用特化的指针版本data<int&, int&> d4(1, 2); // 调用特化的指针版本}

三、模板分离编译

分离编译概念:

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式

模板分离编译:

假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义

示例:

// a.htemplate<class t>t add(const t& left, const t& right);// a.cpptemplate<class t>t add(const t& left, const t& right){return left + right;}// main.cpp#include"a.h"int main(){add(1, 2);add(1.0, 2.0);return 0;}

注:以上代码的模板分离编译会报错

分析:

解决方法

1.将声明和定义放到一个文件“xxx.hpp”(h文件和cpp文件结合)里面或者xxx.h其实也是可以的(推荐)

2.模板定义的位置显式实例化(不实用)

四、模板总结

优点:

模板复用了代码,节省资源,更快的迭代开发,c++的标准模板库(stl)因此而产生增强了代码的灵活性

缺陷:

模板会导致代码膨胀问题,也会导致编译时间变长(为了尽量减少此类问题,编译器会按需实例化)出现模板编译错误时,错误信息非常凌乱,不易定位错误不支持分离编译

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!

本文发布于:2023-04-04 15:25:17,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/6a1728cf35b433b5defa85bac617ee60.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C++初阶学习之模板进阶.doc

本文 PDF 下载地址:C++初阶学习之模板进阶.pdf

标签:特化   模板   参数   类型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图