今天学习了函数模板。主要从一下11个小知识点讲的。
1.函数模板
1.1模板的编译
1.1.1 定义点 编译模板头部
1.1.2 调用点 编译模板的模板体
3.模板函数
4.模板的实参推演
4.1 不能产生二义性
4.2 能够推演 要有实参
5.模板的特例化(专用化)
5.1 部分特例化
5.2 完全特例化
函数模板 只支持完全特例化
类模板 不仅支持完全特例化 还支持部分特例化
模板特例化版本要实现和实例化相同的逻辑
6.模板类型参数
7.模板的非类型参数
非类型参数
1.是常量
2.不能是float double
template<typename T, int SIZE>
void Print(T* arr)
{
for (int i = 0; i < SIZE; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
template<typename T = float,typename E = double,
typename A = int>
E Count(T a, T b, A c)
{
return a + b + c;
}
int main()
{
/*
自适应的调节类型
*/
auto rt = Count<int>(10, 10.1, 30);
int arr[] = { 564, 1, 324, 561, 231, 32, 5 };
Print<int, sizeof(arr) / sizeof(arr[0])>(arr);
return 0;
}
8.模板的默认值
C++11::函数模板的默认值
类模板的默认值
9.接收不明确类型的返回值
10.模板的重载
普通函数版本、模板版本、模板特化版本
在同时有以上三种类型的版本时,优先级如下:
1.普通函数版本 ==》2.模板的特化版本 ==》3.模板版本
bool Compare(char* a, char* b)
{
cout << "Compare(char*,char*)" << endl;
return strcmp(a, b) > 0;
}
template<typename T>
bool Compare(T a, T b)
{
cout << "template<T> Compare(T,T) :"<< typeid(T).name() << endl;
return a > b;
}
template<>
bool Compare<char*>(char* a, char* b)
{
cout << "template<char*> Compare(char*, char*)" << endl;
return strcmp(a, b) > 0;
}
int main()
{
char* p = "hello";
char* q = "world";
Compare<>(p,q); //普通函数版本
Compare<>("hello","world"); //因为字符串为const char* ,普通函数没有,特化也没有,所以为模板版本
return 0;
}
11.模板的隐式实例化,显式实例化
#pragma warning(disable:4996);
template<typename T>
T Sum(T a, T b)
{
return a + b;
}
template<typename T>bool Compare(const T a, const T b){
cout << "template<typename T>" << endl;
cout << "type:" << typeid(T).name() << endl;
return a > b;
}
template<>
bool Compare<char*>(char* const a,char* const b)
{
cout << "template<>" << endl;
return strcmp(a, b) > 0;
}
int main()
{
Compare(10, 20);
Compare<int>(20, 30);
Compare<char*>("hello", "world");
Add(10, 20.1);
/*
--模板的实例化
*/
Sum<int>(10, 20);
Sum<double>(20.1, 30.1);
Sum<char*>("hello", "world");
//Get()
return 0;
}