提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
模板进阶
提示:记录模板一些不太常用的方法:
一、模板进阶代码详述
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
using namespace std;
#if 0
//模板进阶
// #define N 1000
// 类型模板参数
//template<class T>
//template<typename T>
//
//1. 非类型参数 + int N 就是非类型模板参数
/* 1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2.非类型的模板参数必须在编译期就能确认结果。
*/
template<class T , int N>
class Array
{
public:
private:
T _a[N];
};
// 2 模板的特化 (特化 : 针对某些类型的特殊化处理)
template<class T>
bool IsEqual(T& left, T& right)
{
return left == right;
}
//函数模板写法 (特化 : 针对某些类型的特殊化处理)
template<>
bool IsEqual<char*>(char*& left, char*& right)
{
return strcmp(left,right) == 0;
}
//具体的类
template<class T1,class T2>
class Data
{
public:
Data() { cout << "原模版Data<T1,T2>" << endl; }
private:
};
//1 具体的类 特化(全特化:全部的参数特化)
template<>
class Data<int,char>
{
public:
Data() { cout << "全特化 Data<int ,char>" << endl; }
private:
};
//2 偏特化
template< class T2>
class Data<int, T2>
{
public:
Data() { cout << " 偏特化Data<T1,T2>" << endl; }
private:
};
//2 偏特化
template<class T1, class T2>
class Data<T1*, T2*>
{
public:
Data() { cout << " 偏特化Data<T1*,T2*>" << endl; }
private:
};
//2 偏特化 可以是特化部分参数/或者对参数的进一步限制
template<class T1, class T2>
class Data<T1&, T2&>
{
public:
Data() { cout << " 偏特化Data<T1&, T2&>" << endl; }
private:
};
int main()
{
//Array<int,100> a1;//100
//Array<int,1000> a2;//1000
Data<int, int> d1;
Data<int, double> d2;
Data<int, char> d3;
Data<char, char> d4;
Data<char*, char*> d5;
Data<char&, char&> d6;
return 0;
}
#endif
二、在.h文件中的使用
#pragma once
#include <iostream>
using namespace std;
void F1()
{
cout << " F1" << endl;
}
//同样是分离编译,普通函数可以,函数模板/类模板为什么不行?
// 预处理-> 展开头文件 替换宏 条件编译 删除注释 .i
// 编译 检查语法 生成汇编代码 .s
// 汇编 将汇编代码转成二进制的机器码 .o
// 链接 将目标文件合到一起,编译时函数有声明,链接时去找函数的地址 a.out
template<class T>
void F2(const T& x)
{
cout << "void f2 const T"<<x << endl;
}
// 1 显式实例化 不常用 因为不方便
// 2 不要分离编译
//template
//void F2<int>(const int& x);
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了模板的使用,最主要还是要视情况去使用,不然可能用的时候很容易出错。