C++语法(13)---- 模拟实现priority_queue_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130069707?spm=1001.2014.3001.5501
目录
1.非类型模板参数
2.模板的特化
1.函数模板(仿函数)
2.类模板
1.全特化
2.半特化、偏特化
1.以前使用的都是类型模板参数,形如 template
写法的,这种写法适用于泛型编程,我们希望不同的类型都可以通过模板让编译器演化出来 2.面对如静态数组,我们希望构造出的一个数组,c语言静态数组定义大小使用宏定义来解决问题,如下
#define NUM_SIZE 5 namespace MY { template
struct arr { public: T _a[NUM_SIZE]; }; } int main() { MY::arr arr_int; MY::arr arr_double; return 0; } 不过我们如果我们要不同类型的不同数组大小呢?很明显宏定义不是一个很好的解决方法
3.非类型模板参数可以完美解决问题
非类型模板参数:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
namespace MY { template
struct arr { public: T _a[N]; }; } int main() { MY::arr arr_int; MY::arr arr_double; return 0; } c++也实现了数组的stl,该实现就是用了非类型模板参数,不过重要的是,array封装中检查了是否访问越界,c++越界读写都检查,c语言读不检查,写随机检查,只查超过范围小的。c++中重写了operator[],里面会判断是否越界。
4.非类型模板参数只适用于常量整型,浮点数不能使用,变量也不可以
特化:特殊类型被特殊处理,这种处理就是特化
未处理的:
假设我们加上了日期类的实现,并且里面有大小比较
template
bool Less(T left, T right) { return left < right; } int main() { cout << Less(1, 2) << endl; // 可以比较,结果正确 Date d1(2022, 7, 7); Date d2(2022, 7, 8); cout << Less(d1, d2) << endl; // 可以比较,结果正确 Date* p1 = &d1; Date* p2 = &d2; cout << Less(p1, p2) << endl; // 可以比较,结果错误 return 0; } 我们传入的是指针时,会发现日期类的指针是没有办法用现有的仿函数进行比较的,因为其直接比较指针的大小,而不是解引用比较日期
处理的:
// 函数模板 -- 参数匹配 template
bool Less(T left, T right) { return left < right; } // 对Less函数模板进行特化 template<> bool Less (Date* left, Date* right) { return *left < *right; } int main() { cout << Less(1, 2) << endl; Date d1(2022, 7, 7); Date d2(2022, 7, 8); cout << Less(d1, d2) << endl; Date* p1 = &d1; Date* p2 = &d2; cout << Less(p1, p2) << endl; // 调用特化之后的版本,而不走模板生成了 return 0; } 特化了less针对Date*的比较,那么当main函数进行到Date*的比较,就使用特化的类进行比较了。
###针对函数模板(仿函数)其实算是重载,使用不加类模板也可以直接写函数
1.全特化
template
class Data { public: Data() { cout << "Data " << endl; } private: T1 _d1; T2 _d2; }; //上面的特化 template<> class Data { public: Data() { cout << "Data " << endl; } private: double _d1; double _d2; }; int main() { Data D1; Data D2; return 0; }
2.半特化、偏特化
半特化
template
class Data { public: Data() { cout << "Data " << endl; } private: double _d1; double _d2; }; int main() { Data D1; Data D2; Data D3; return 0; } 偏特化:参数进行进一步限制
指针和引用
template
class Data { public: Data() { cout << "Data " << endl; } private: double _d1; double _d2; }; int main() { Data D1; Data D2; Data D3; Data D4; Data D5; return 0; } 只要是指针都会走这个偏特化