#include <iostream>
#include <string>
using namespace std;
//函数模板,有自动类型推导,也可以使用显式指定类型
template<typename T>
void fun(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
template<typename T>
void swap(T x[],int len)
{
for (int i = 0; i < len; i++)
{
int temp = i;
for (int j = i + 1; j < len; j++)
{
if (x[temp]> x[j])
{
temp = j;
}
}
if (i != temp)
{
T y = x[i];
x[i] = x[temp];
x[temp] = y;
}
}
for (int i = 0; i < 10; i++)
{
cout << x[i] << '\t';
}
cout << endl;
}
void test01()
{
int x = 9, y = 10;
fun<int>(x, y);
cout << "x:" << x << "\ty:" << y << endl;
int z[10] = { 56,58,12,56,88,46,87,45,11,54 };
swap(z,sizeof(z)/sizeof(int));
char s[] = "cbsdawh";
swap(s, sizeof(s) / sizeof(char)-1);
}
//类模板,没有自动类型推导但是可以有默认参数
//类模板中函数的创建时机,只有当使用时才会创建
template<typename MYname = string, typename MYage = int>
class Person
{
public:
Person(MYname name, MYage age)
{
this->m_name = name;
this->m_age = age;
}
MYname m_name;
MYage m_age;
};
void test02()
{
Person<> p("王大锤",18);
}
//当类模板做函数参数时需要直接指定类型传入或者使用默认参数
//或者将参数模板化或者将类模板化(相当于函数模板和类模板配合使用,一般来说都是用第一种方法)
void test03(Person<>&p)
{
}
//当类模板做父类继承时必须指定父类的数据类型
class Person1 :public Person<string,int>
{
};
//如果想灵活推导类型需把子类也定义成类模板
template<typename T1, typename T2, typename T3>
class Person2 :public Person<T1,T2>
{
T3 num;
};
//模板类的成员函数类外实现,相对普通类的类外实现得在作用域前面加上模板的参数列表
template<typename T1>
class Person3
{
public:
Person3(T1);
T1 m_name;
};
template<typename T1> //模板声明
Person3<T1>::Person3(T1 name) //类名<模板参数列表>::类名(参数)
{
m_name = name;
}
//当类模板分文件编写时,由于是在调用时创建,所以会导致链接不到
//解决方法:直接包含cpp文件或者把将声明和实现写在同一个文件内并把文件后缀改成.hpp
//在类模板中友元函数如果不是特殊要求就尽量在类内实现,因为在类外实现需要提前让编译器知道有这样一个函数和类比较麻烦
int main()
{
system("pause");
return 0;
}
C++:模板
最新推荐文章于 2023-01-04 11:46:28 发布