C++ primer 随笔(5)(模板)

函数模板示例

template <class T>
T max(T a,T b)
{
   return(a<b)?a:b;
}

char a,b;
char c=max<char>(a,b);

templete<typename T,typename S>
void max(T a,S b)
{
    //内容      
}

template<typename T,int X>
void f(T a)
{
    cout<<X<<endl;
}

f<char,5>('v');

类模板示例

template <typename T>
class A
{
public:
 void f();
 ...
private:
 T *ptr; 

}
template <typename T>
void A<T>::f()
{
  ...
}

//实例化时
A<int> a;

//示例二:
template <typename T,int Tsize>
class B
{
public: 
  void f();
private:
  T t;  
}
template <typename T,int Tsize>
void B<T,Tsize>::f()
{
   for(int i=0;i<Tsize;i++)
   {
        cout<<t<<endl;
   }
}
//实例化时
B<char,5> b;
b.f();

很多编译器不支持将类模板与模板函数分离成.h与.cpp编译
类外定义成员函数时,每一个函数前都要加template声明

函数模板的显式实参

常用在实现不同数据类型做处理或运算的时候,返回值可能是不同于实参类型的。
如:实现int与long 的加法操作
合理的处理方法是:
将较小的数据类型强制转换后再做运算,运算结果用较大数据类型保存。
指定返回类型的一种方式是引入第三个模板形参,它必须由调用者显示指定。

template <typename T1,typename T2,typename T3>
T1 sum(T2,T3)
{...}

调用时需要显式指定:

long val3=sum<long>(i,lng);

应当注意的是:显式模板形参从左至右与模板形参相匹配,即函数定义处的形参顺序是与模板声明从左至右依次匹配的。正由于依次匹配,因此调用时最右边两个形参的显式模板实参才可以省略。
如果函数定义时顺序不匹配,则需要在函数调用时为所有的形参指定实参。
例如:

long val3=sum<long,int,long>(i,lng);

编译模板模型

当编译器看到模板定义的时候,它不立即产生代码,只有在看到模板时,如调用了函数模板或定义了类模板的对象的时候,编译器才产生特定类型的模板实例。
最常用的是 包含模型
需要在头文件中声明模板,格式如下:

template <typename T> int compare(const T&,const T&);
#include "a.cpp"

a.cpp中应当包含模板函数的定义

template <typename T> int compare(const T &v1,const T &v2)
{
    if(v1<v2) return -1;
    if(v2<v1) return 1;
    return 0;
}

此外还有只有部分编译器支持的***分别编译模型***,这里不加解释

猜你喜欢

转载自blog.csdn.net/lxx909546478/article/details/88920421