iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++深入浅出探索模板
  • 209
分享到

C++深入浅出探索模板

2024-04-02 19:04:59 209人浏览 独家记忆
摘要

目录非类型模板参数模板特化函数模板特化类模板特化全特化偏特化模板分离编译模板的分离编译解决方法总结非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参:出现在模板参数列表中,

非类型模板参数

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

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

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

注意:

  • 浮点数,类对象以及字符串是不允许作为非类型模板的。
  • 非类型的模板参数必须在编译期就能确认结果。

模板特化

有时候,编译默认函数模板或者类模板不能正确处理需要逻辑,需要针对一些情况特殊化处理,就要做模板特化。

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

template<class T>
bool IsEqual(const T&left,const T&right)
{
    return left==right;
}
//针对字符串类型要特殊化处理--写一份函数模板的特殊化出来
template<>
bool IsEqual<char*>(const char* &left,const char* &right)
{
    return strcmp(left,right)==0;
}
​
int main()
{
    cout<<IsEqual(1,2)<<endl;//0
    cout<<IsEqual(1.1,1.1)<<endl;//1
    
    char p1[]="hello";
    char p2[]="hello";
    cout<<IsEqual(p1,p2)<<endl;//0
    
    const char* p3="hello";
    const char* p4="hello";
    cout<<IsEqual(p3,p4)<<endl;//1
}

此时,就需要对模板进行特化。即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化。

特化的本质:显示指定实例化的模板

函数模板特化

函数模板特化步骤

  • 必须要先有一个基础的函数模板
  • 关键字template后面接一对空的尖括号<>
  • 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  • 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误
template<>
bool IsEqual<const char* const>(const char* const &left,const char* &right)
{
    if(strcmp(left,right)>0)
        return true;
    return false;
}

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

类模板特化

全特化

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

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

偏特化

针对任何模板参数进一步进行条件限制设计的特化版本,比如对于一下模板类:

template<class T1,class T2>
class Data
{
public:
    Data(){cout<<"Data<T1,T2>"<<endl;}
private:
    T1 _d1;
    T2 _d2;
};
//偏特化有以下两种表现方式:
//1、部分特化:将函数中的一部分参数特化。
​
template<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(){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.h
template<class T>
T Add(const T& left, const T& right);
// a.cpp
template<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++的标准模板库(STL)因此而生
  • 增强了代码的灵活性

缺点

  • 模板会导致代码膨胀问题,也会导致编译时间变长。
  • 出现模板编译错误时,错误信息非常杂乱,不易定位错误。

到此这篇关于C++ 深入浅出探索模板的文章就介绍到这了,更多相关C++ 模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++深入浅出探索模板

本文链接: https://www.lsjlt.com/news/146122.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++深入浅出探索模板
    目录非类型模板参数模板特化函数模板特化类模板特化全特化偏特化模板分离编译模板的分离编译解决方法总结非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参:出现在模板参数列表中,...
    99+
    2022-11-13
  • C++深入浅出探索数据结构的原理
    目录一、前言二、C++的数据结构三、定义结构四、访问结构成员五、结构作为函数参数六、指向结构的指针一、前言 因为C++的数据结构很多,很复杂,一篇文章根本讲不到所有的数据结构。即使写...
    99+
    2022-11-13
  • 深入浅出探索Java分布式锁原理
    目录什么是分布式锁?它能干什么?分布式锁实现方案基于数据库的分布式锁实现方案实现原理方案分析基于Redis的分布式锁实现方案基于sentnx命令的实现原理方案分析基于Redisson...
    99+
    2022-11-13
  • 04.深入浅出索引(上)
       简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样。 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常见的数据结果有以下三种:哈希表、有序数组和搜索树。...
    99+
    2020-03-05
    04.深入浅出索引(上)
  • 05.深入浅出索引(下)
         在下面这个表T中,如果我们执行select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? mysql> create table T ( id i...
    99+
    2018-05-04
    05.深入浅出索引(下)
  • 深入浅出探究JavaScript中的async与await
    目录1、前言2、详解2.1、async2.1.1、函数返回非Promise对象2.1.2、函数返回Promise对象2.2、await2.3、async、await结合使用2.4、a...
    99+
    2022-11-12
  • C++可变参数模板深入深剖
    目录概念模板定义参数包展开递归函开逗号表达式展开emplace使用方法工作原理意义总结概念 C++11 新增一员猛将就是可变参数模板,他可以允许可变参数的函数模板和类模板来作为参数,...
    99+
    2022-11-13
    c++ 可变参数模板 C++ 可变参数 c++11 可变参数模板
  • 【深入浅出设计模式--状态模式】
    深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧...
    99+
    2023-08-30
    c++ 设计模式 状态模式 单例模式
  • C语言深入探索递归的特点
    目录递归的认识main函数可以递归吗递归核心思想讲解递归的缺点递归的认识 基本认识: 1.首先递归的本质还是函数调用,也要形成和释放栈帧。 2.函数的调用是有成本的,这个成本在时间和...
    99+
    2022-11-13
  • C++深入细致探究二叉搜索树
    目录1、二叉搜索树的概念2、二叉搜索树的操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除3、二叉搜索树的实现4、二叉搜索树的性能分析1、二叉搜索树的概念  二叉搜索树又...
    99+
    2022-11-13
  • C++深入浅出讲解缺省参数
    目录缺省参数定义用法缺省参数 一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。 定...
    99+
    2022-11-13
  • 【C++深入浅出】日期类的实现
    目录 一. 前言  二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 +/- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整...
    99+
    2023-09-18
    c++ 类和对象 日期类 运算符重载
  • C++深入浅出讲解函数重载
    目录前言函数重载1.1 函数重载的概念1.2 函数重载的意义1.3 名字修饰(name Mangling)1.4 extern "C"前言 自然语言中,一个词可以...
    99+
    2022-11-13
  • 【C++深入浅出】类和对象下篇
    一. 前言         老样子,先来回顾一下上期的内容:上期我们着重学了C++类中的六大默认成员函数,并自己动手实现了一个日期类,相信各位对C++中的类已经有了一定程度的了解。本期就是类和对象的最后一篇啦,终于要结束咯,吧唧吧唧  ...
    99+
    2023-10-10
    c++ 开发语言 初始化列表 static成员 友元 匿名对象 explicit关键字
  • C++深入探究list的模拟实现
    目录迭代器正向迭代器类反向迭代器类push_back尾插函数push_front头插函数insert插入函数erase删除函数pop_front函数pop_back函数构造函数析构函...
    99+
    2022-11-13
  • Java深入探索单例模式的应用
    目录1.单例2.单例设计模式的应用实例1.步骤2.单例模式-饿汉式3.单例模式-懒汉式1.单例 1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一...
    99+
    2022-11-13
  • C++深入了解模板的使用
    目录一.泛型编程二.函数模板1.函数模板概念2.函数模板格式3.函数模板的原理三.类模板一.泛型编程 泛型编程:不再是针对某种类型,能适应广泛的类型,跟具体的类型无关的代码 如何实现...
    99+
    2022-11-13
  • C++模板全方位深入解读
    目录1.泛型编程2.函数模板概念函数模板的格式函数模板的原理函数模板的实例化隐式实例化显式实例化模板参数的匹配原则3.类模板(1) 类模板的定义格式(2) 类模板的实例化4.非类型模...
    99+
    2022-11-13
  • Java深入浅出讲解代理模式
    目录1、动态代理模式2、JDK动态代理3、JDK动态代理代码演示1、动态代理模式 动态代理的特点: 当代理对象的时候,不需要实现接口代理对象的生成,是利用JDK的API,动态的在内存...
    99+
    2022-11-13
  • Java设计模式之单例模式深入探索
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)小...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作