文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++深入浅出探索模板

2024-04-02 19:55

关注

非类型模板参数

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

类型形参:出现在模板参数列表中,跟在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<>
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++ 深入浅出探索模板的文章就介绍到这了,更多相关C++ 模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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