1,函数模板和普通函数的区别
- 普通函数可以进行自动类型转换
- 函数模板不允许自动类型转换
template <typename T>
T swapMy(T& a, T& b)
{
return a+b;
}
int MySwap(int a, int b)
{
return a + b;
}
void main()
{
string a = "hello";
string b = "world";
cout << "a = " << swapMy(a, b) << endl;
int aa = 100;
int bb = 89898989;
cout << "a = " << swapMy(aa, bb) << endl;
char c = 'h';
cout << "MySwap = " << MySwap(aa, c) << endl;
}
2,函数模板和普通函数一起调用规则
- 函数模板可以像普通函数那样重载
- List item
- 两函数重名,C++编译器优先考虑普通函数,普通函数不匹配了再去调用模板
- 可以通过空模板实参列表的语法限定编译器智能通过模板匹配。
MySwap<>(aa,c);
3,C编译过程
4,类模板
template<class T>
class MyBase
{
public:
MyBase(T a, T b)
{
this->a = a;
this->b = b;
}
T add()
{
return this->a + this->b;
}
public:
T a;
T b;
};
void main()
{
MyBase<int> base(43, 43);
cout << "add = " << base.add();
}
函数模板使用时,可以自动类型推导,类模板必须显示调用类型
{
MyBase<int> base(43, 43);
cout << "add = " << base.add();
}
5,类模板派生普通类
template<class T>
class MyBase
{
public:
};
//编译时需要分配内存
class MySon :public MyBase<int>
{
};
派生普通类的时候,要定义类型,否则编译的时候不知道需要分配多少的内存。
6,防止头文件复用
C:
#ifndef XXX_H //Ctrl + shift +u转为大写
#define XXX_H
#endif
C++:
#pragma once //防止头文件被重复包含
7,类模板类内实现
template<typename T1, typename T2>
class A
{
public:
A(T1 a, T2 b)
{
as = a;
ad = b;
}
void showTest()
{
cout << "as = " << as << endl;
cout << "ad = " << ad << endl;
}
public:
T1 as;
T2 ad;
};
void main()
{
A<int, int> aa(13, 456);
aa.showTest();
}
8,类模板类外实现
template<typename T1, typename T2>
class AA
{
public:
AA(T1 a, T2 b)
{
as = a;
ad = b;
}
void showTest()
{
cout << "as = " << as << endl;
cout << "ad = " << ad << endl;
}
void test();
public:
T1 as;
T2 ad;
};
//实现部分注意事项
template<typename T1, typename T2>
void AA<T1, T2>::test()
{
cout << "as = " << as << endl;
cout << "ad = " << ad << endl;
}