C++初阶--模板
创始人
2024-05-14 10:31:07

目录

非类型模板参数

模板的特化

        什么是特化

        函数模板特化

        类模板特化

                全特化

                偏特化

模板分离编译

        什么是分离编译

        为什么模板不支持分离编译

        解决方法

模板的优点和缺陷


非类型模板参数

类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
//非类型模板参数--整形常量
template
class MyStack
{
public:void Push(const T& x){}
private:T _a[N];size_t _top;
};int main()
{MyStack st1;MyStack st2;return 0;
}
1. 非类型模板参数只能是整形。  2. 非类型模板参数必须在编译时就能确认结果。   

模板的特化

什么是特化:

在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。 函数模板--参数匹配
//函数模板--参数匹配
template
bool ObjLess(T left, T right)
{return left < right;
}bool ObjLess(Date* left, Date* right)
{return *left < *right;
}template<>
bool ObjLess(Date* left, Date* right)
{return *left < *right;
}int main()
{cout << ObjLess(1, 2) << endl;Date* p1 = new Date(2011, 1, 23);Date* p2 = new Date(2013, 3, 23);//参数匹配cout << ObjLess(p1, p2) << endl;return 0;
}

函数模板特化

步骤:

1. 必须要先有一个基础的函数模板 2. 关键字template后面接一对空的尖括号<> 3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型 4. 函数形参表: 必须要和模板函数的基础参数类型完全相同
template
class Data
{
public:Data(){ cout << "Date" << endl;}
private:T1 _d1;T2 _d2;
};//特化--特殊化
template<>
class Data
{
public:Data() { cout << "Data" << endl; }
private:int _d1;char _d2;
};int main()
{//Data d1;//Data d2;qwe::priority_queue pq;pq.push(new Date(2022, 3, 26));pq.push(new Date(2021, 10, 26));pq.push(new Date(2023, 3, 26));while (!pq.empty()){cout << *pq.top();pq.pop();}cout << endl;return 0;
}

类模板特化

全特化

将模板参数列表中所有的参数都确定化
template
class Data
{
public:Data(){cout << "Data" << endl;}
private:T1 _d1;T2 _d2;
};//全特化
template<>
class Data
{
public:Data(){cout << "Data" << endl;}
};

偏特化

任何针对模版参数进一步进行条件限制设计的特化版本
//偏特化
template
class Data
{
public:Data(){cout << "Data" << endl;}
};template
class Data
{
public:Data(){cout << "Data" << endl;}
};template
class Data
{
public:Data(){cout << "Data" << endl;}
};

对非类型模板参数也可以

template
class A
{
public:A(){cout << "A" << endl;}
};template<>
class A<10>
{
public:A(){cout << "A<10>" << endl;}
};

模板分离编译

什么是分离编译

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

为什么模板不支持分离编译

        模板函数的代码不能直接编译成二进制代码,其中要有一个“实例化”的过程。解决方案在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找。这种模式在没有模板的情况下可以运行,但因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。但是当实现该模板的.cpp文件中没有用到模板的实例时,编译器就没有去实例化,所以,整个工程的.obj中就找不到一行模板实例的二进制代码,于是连接器也黔驴技了。

解决方法

1.显示实例化

2.声明和定义不分离

模板的优点和缺陷

优点: 1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生 2. 增强了代码的灵活性 缺陷: 1. 模板会导致代码膨胀问题,也会导致编译时间变长(实例化过程消耗) 2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
如何吸引顾客 怎样吸引顾客加入... 如何激活群的顾客活跃度,是商家在运营过程中绕不开的事情。当新用户来到商家的私域流量群时,商家一般会采...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
地铁怎么买票 乘坐地铁如何买票 目前,上海轨道交通全网络运营里程已增至831公里,线路增至20条,与此同时,轨道交通的支付方式也日益...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...