C++中的模板可以分为三类:class template,function template,member template。
类模板Class Template
template<typename T>
class complex
{
public:
complex(T r = 0, T i = 0)
: re(r), im(i)
{}
complex& operator += (const complex&)
T real() const { return re; }
T imag() const { return im; }
private:
T re, im;
};
complex<double> c1(2.5,1.5);
complex<int> c2(2,6);
函数模板Function Template
#include<iostream>
using std::cout;
using std::endl;
class stone
{
public:
stone(int w = 0, int h = 0, int we = 0)
: _w(w), _h(h), _weight(we)
{}
bool operator< (const stone& rhs) const
{
return _weight < rhs._weight;
}
private:
int _w, _h, _weight;
};
template<class T>
inline
const T& min(const T& a, const T& b)
{
return a < b ? a : b;
}
int main()
{
stone r1(2,3,2), r2(2,3,3), r3;
r3 = min(r1, r2);
}
编译器会对function template进行实参推导(argument deduction),当调用min函数时,编译器就会自动知道类型T为stone,再调用stone::operator<
成员模板Member template
template<class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
: first(T1()), second(T2()) {}
pair(const T1& a, const T2& b)
: first(a), second(b) {}
template<class U1, class U2> //member template
pair(const pair<U1, U2>& p)
: first(p.first), second(p.second) {}
};
在上面的程序中,类pair(表示一对)有三个构造函数,其中第三个构造函数就用到了成员模板。成员模板参数为U1、U2,类模板参数为T1、T2,都可变。可以用它来表示继承关系,鱼类和鸟类为基类Base,鲫鱼和麻雀为子类Derived。
把一个由鲫鱼和麻雀构成的pair,放进(拷贝到)一个由鱼类和鸟类构成的pair中,是可以的。但是反之,是不行的。