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. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关内容

热门资讯

阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...