C++的编程思想除了面向对象之外还有泛型编程,强调独立于特定数据类型实现功能
泛型编程主要利用的技术就是模板和STL
模板分为两种机制,函数模板和类模板
1.函数模板的使用
template <class T> 这里写typename或者class都可以
void Myswap (T &a, T &b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
int main(void)
{
int a = 10;
int b = 20;
Myswap<int>(a,b); 模板调用的时候也可以不加上类型,使用Myswap(a,b)自动类型推导
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
普通函数和模板函数的调用规则:void fun(int a); template<class T> void fun(T a);
1.如果二者都可以调用,则预先调用普通函数
2.通过空模板参数列表,可以强制调用模板函数 fun<>();
3.函数模板也可以发生重载
4.如果模板函数可以产生更好的匹配,优先调用模板函数
void fun(int a); template<class T> void fun(T a);
调用时:char m; fun(m);
这里可以发生隐式类型转换,所以第一个也可以调用,但是模板函数更匹配,所以调用模板函数
自定义的数据类型无法无法使用模板来实现,因此需要使用重载具体化一个模板
class Person
{
public:
string name;
Person(string name)
{
this->name = name;
}
};
template<class T>
bool Comp(T &a, T &b)
{}
template<> bool Comp(Person &a, Person &b) //具体化重载的一个模板
{
if(a.name == b.name)
return true;
return false;
}
int main(void)
{
Person p1("hello");
Person p2("hello");
bool ret = Comp(p1, p2);
if(ret)
{
cout << "equal" << endl;
}
else
{
cout << " not equal" << endl;
}
}
2.类模板
类的模板可以有默认参数
//template<class NameType, class AgeType = int>这样下面传参数的时候可以只传递一个参数
template<class NameType, class AgeType>
class Person
{
public:
NameType name;
AgeType age;
Person(NameType name, AgeType age)
{
this->name = name;
this->age = age;
}
};
int main(void)
{
Person<string, int> p ("张三", 66);
cout << "name = " << p.name << endl;
cout << "age = " << p.age << endl;
}
类模板对象做函数的参数
template<class NameType, class AgeType>
class Person
{
public:
NameType name;
AgeType age;
};
**void fun(Person<string, int>&p);**
int main(void)
{
Person<string, int> p ("张三", 66);
fun(p);
}
类模板与继承
template<class T>
class Person
{
public:
T m;
};
class Son :public Person<int>
{};
如果希望子类可以灵活指定数据类型,则也要变成模板类
template<class T>
class Person
{
public:
T m;
};
template<class T1, class T2>
class Son :public Person<T2>
{
T1 m;
};
Son<int ,char> s; //相当于给父类传递了一个char,然后自己指定了一个int
类模板的类外形式的实现
template<class T1, class T2>
Person<T1, T2>::Person<T1 name, T2 age>
类模板份文件编写的时候,如果在main函数中包含.h文件会产生错误,因为类模板的成员函数之前不会被创建。有两种解决办法,一种是将.h和.cpp文件写在一起,命名为.hpp文件(用的较多)。或者分开写但是main函数中包含.cpp文件。