文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++非模板类型参数怎么用

2023-06-26 06:15

关注

本篇内容介绍了“C++非模板类型参数怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、非模板类型参数

分类:

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

概念:

类型形参:

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

非类型形参:

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

示例:

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;};}

注意:

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

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

二、模板特化

概念:

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

示例:

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

特殊化结果:

C++非模板类型参数怎么用

 不做特殊化结果:

 C++非模板类型参数怎么用

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

特化分类:

函数模板特化类模板特化

1、函数模板特化

函数模板的特化步骤:

示例:

template<class T>bool IsEqual(const T left, const T right){return left == right;}template<>bool IsEqual<char*>(char* left,char* right){if (strcmp(left, right) == 0)return true;return false;}

结果:

 C++非模板类型参数怎么用

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

示例:

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

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>" << endl; }private:int _d1;char _d2;};void TestVector(){Data<int, int> d1;Data<int, char> d2;}
2)偏特化

概念:

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

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

部分特化

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

示例:

// 将第二个参数特化为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;};

参数更进一步的限制

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

示例:

//两个参数偏特化为指针类型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(){Data<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; }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(){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;}

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

分析: 

C++非模板类型参数怎么用

解决方法

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

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

四、模板总结

优点:

缺陷:

“C++非模板类型参数怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯