c 模板
- 什么是模板
-
- 书写的方式和作用
- 函数模板
-
- 案例一(模板与普通函数)
- 案例二(模板与模板)
- 函数模板缺省
- 函数模板传常量
- 模板的嵌套
模板编程也叫泛型编程,忽略数据类型的一种编程方式。
书写的方式和作用
模板的书写方式:
1.template
2.template
这里主要是讲诉函数模板重载的问题,以及调用情况的问题
案例一(模板与普通函数)
#include
#include
using namespace std;
template
//template
t1 max(t1 a, t1 b)
{
cout << "调用函数模板" << endl;
return a > b ? a : b;
}
int max(int a, int b)
{
cout << "调用普通函数" << endl;
return a > b ? a : b;
}
int main()
{
//编译器优先调用类型确定的函数
cout << max(1, 2) << endl; //调用的普通函数
cout << max(1, 2) << endl; //调用函数模板(显式调用)
system("pause");
return 0;
}
案例二(模板与模板)
#include
using namespace std;
template
void print(t a, t b, t c)
{
cout << "一个类型" << endl;
}
template
void print(t1 a, t1 b, t2 c)
{
cout << "两个类型" << endl;
}
template
void print(t11 a, t22 b, t33 c)
{
cout << "三个类型" << endl;
}
int main()
{
print(1, 2, 3); //调用的第一个
print(1, 2, "3"); //调用第二个
print(1, 2.9, "3");//调用第三个
print(1, 2, 3); //传参类型少的先调用
print(1, "1", "1");
system("pause");
return 0;
}
函数模板缺省
函数模板缺省跟函数缺省规则一样,都是从右往左缺省
#include
using namespace std;
template
int main()
{
system("pause");
return 0;
}
函数模板传常量
函数模板里写常量,在传参的时候,也应该传常量,而不是变量。
#include
#include
using namespace std;
class mm
{
public:
mm (){
}
mm(int age, string name) : age(age), name(name) {
}
private:
int age;
string name;
};
template
void print(t date)
{
cout << date << endl;
}
int main()
{
mm mm(10,"温柔了岁月");
print(mm);
system("pause");
return 0;
}
如图所示,不能够直接打印出,要使用运算法重载,打印自定义类型
#include
#include
#include
using namespace std;
class mm
{
public:
mm() {
}
mm(int age, string name) : age(age), name(name) {
}
friend ostream& operator << (ostream & out,mm & object)
{
out << object.age << setw(5) << object.name << endl;
return out;
}
private:
int age;
string name;
};
template
void print(t date)
{
cout << date << endl;
}
int main()
{
mm mm(10,"温柔了岁月");
print(mm);
system("pause");
return 0;
}
将一个类名,当做模板的一个类型
#include
#include
#include
using namespace std;
class mm
{
public:
mm() {
}
mm(int age, string name) : age(age), name(name) {
}
friend ostream& operator << (ostream& out, mm& object)
{
out << object.age << setw(5) << object.name << endl;
return out;
}
private:
int age;
string name;
};
template
class mm1
{
public:
mm1(t1 a, t2 b, t3 c): a(a), b(b), c(c) {
}
void printdate()
{
cout << a << b << c << endl;
}
private:
t1 a;
t2 b;
t3 c;
};
int main()
{
mm1 mm(mm(19,"ni"),90,90); //mm这个类,当做模板的类型,所传的参数要与之相对应
mm.printdate(); //因为在mm那个类中写了运算符重载,所以这里不不要写运算符重载
system("pause");
return 0;
}
这里用的是类的模板嵌套
注意的是:这里类名时候,必须要、
类名<类型>的形式
#include
#include
using namespace std;
template
class mm
{
public:
mm(t1 a, t2 b): a(a),b(b) {
}
private:
t1 a;
t2 b;
};
template
class mm
{
public:
mm(t c): c(c) {
}
private:
t c;
};
int main()
{
mm mm1(1,2);
mm mm2(1);
mm, mm> mm3(mm(1), mm(2)); //嵌套
//可以通过起别名的方式,是代码变得简洁;
using type = mm;
mm mm5(type(1), type(3));
//如果要打印的话,自然还是要是使用运算符重载
system("pause");
return 0;
}