C++模板:函数模板、类模板、模板与继承

  C++模板:描述    

        C++提供一种模板的机制来减少代码重复。比如:对于同一样函数使用不同的数据类型,int,double,char等。C++模板属于“元编程”的范畴。

C++ 模板函数

                 1.支持不同数据类型的函数重载:

#include 
using namespace std;

int square (int x)
{
  return x * x;
};

float square (float x)
{
  return x * x;
};

double square (double x)
{
  return x * x;
};

main()
{
   int    i, ii;
   float  x, xx;
   double y, yy;

   i = 2;
   x = 2.2;
   y = 2.2;

   ii = square(i);
   cout << i << ": " << ii << endl;

   xx = square(x);
   cout << x << ": " << xx << endl;

   yy = square(y);
   cout << y << ": " << yy << endl;
}
    


2.支持所有数据类型的函数模板

#include 
using namespace std;

template 
inline T square(T x)
{
   T result;
   result = x * x;
   return result;
};



main()
{
   int    i, ii;
   float  x, xx;
   double y, yy;

   i = 2;
   x = 2.2;
   y = 2.2;

   ii = square(i);
   cout << i << ": " << ii << endl;

   xx = square(x);
   cout << x << ": " << xx << endl;

   // Explicit use of template
   yy = square(y);// 显式使用模板
   cout << y << ": " << yy << endl;

   yy = square(y);//隐含的方式使用模板
   cout << y << ": " << yy << endl;
}
    

注明:模板的关键字可以用class或者typename.

  • template
  • template

两者表达的意思是一样的,但是我更喜欢使用后者。

可以采用两种方式使用模板函数square(value) or square(value). 在模板函数的定义中,T代表数据类型。 模板的声明和定义必须在同一个文件中,如头文件中。 C语言的宏定义也可以实现函数模板的功能,#define square(x) (x * x)
但是宏没有类型检查,函数模板有类型检查。

 

C++ 模板特例化

下面的例子字符串类型需要特殊处理,采用模板的特例化

#include 
using namespace std;

template 
inline T square(T x)
{
   T result;
   result = x * x;
   return result;
};

// 模板特殊化
template <>
string square(string ss)
{
   return (ss+ss);
};

main()
{
   int i = 2, ii;
   string ww("Aaa");

   ii = square(i);
   cout << i << ": " << ii << endl;

    cout << square(ww) << endl;
}
    

注明:模板特例化用于当一个数据类型需要进行不同的处理和实现的情况。



 C++ 模板无类型参数

 

#include 
using namespace std;

template 
void loopIt(T x)
{
   T val[count];

   for(int ii=0; ii(xx);
}

 C++ 模板默认类型参数以及无类型参数

#include 
using namespace std;

template 
T multIt(T x)
{
   for(int ii=0; ii(xx) << endl;;
}


注明:multIt<>没有指定参数类型,默认为float;

 C++ 类模板

类模板定义:template class MyTemplateClass { ... };

类模板特例化:template <> class MyTemplateClass { ... };

File: Matrix2x2.hpp

#ifndef MATRIX_2X2_HPP__
#define MATRIX_2X2_HPP__

using namespace std;

/**
    m(11)  m(12)
    m(21)  m(22)
*/

template 
class Matrix2x2
{
public:
   Matrix2x2(T m11, T m12, T m21, T m22);    //constructor
   Matrix2x2(T m[2][2]);
   Matrix2x2();

   int Add(Matrix2x2 x)
   int Multiply(Matrix2x2 x)
   void Print();
   T m[2][2];
};

template 
Matrix2x2::Matrix2x2(T _m11, T _m12, T _m21, T _m22)
{
   m[0][0] = _m11;
   m[0][1] = _m12;
   m[1][0] = _m21;
   m[1][1] = _m22;
}

template 
Matrix2x2::Matrix2x2(T _m)
{
   m[0][0] = _m[0][0];
   m[0][1] = _m[0][1];
   m[1][0] = _m[1][0];
   m[1][1] = _m[1][1];
}

template 
Matrix2x2::Matrix2x2()
{
   m[0][0] = 0;
   m[0][1] = 0;
   m[1][0] = 0;
   m[1][1] = 0;
}

template 
Matrix2x2::Add(Matrix2x2 _x)
{
    Matrix2x2 sum;
    sum.m[0][0] = m[0][0] + _x.m[0][0];
    sum.m[0][1] = m[0][1] + _x.m[0][1];
    sum.m[1][0] = m[1][0] + _x.m[1][0];
    sum.m[1][1] = m[1][1] + _x.m[1][1];
    return sum;
}

template 
Matrix2x2::Multiply(Matrix2x2 _x)
{
    Matrix2x2 sum;
    sum.m[0][0] = m[0][0] * _x.m[0][0] + m[0][1] * _x.m[1][0];
    sum.m[0][1] = m[0][0] * _x.m[0][1] + m[0][1] * _x.m[1][1];
    sum.m[1][0] = m[1][0] * _x.m[0][0] + m[1][1] * _x.m[1][0];
    sum.m[1][1] = m[1][0] * _x.m[0][1] + m[1][1] * _x.m[1][1];
    return sum;
}

template 
Matrix2x2::Print()
{
    cout << "|" << m[0][0] << "  " <<  m[0][1] << "|" << endl;
    cout << "|" << m[1][0] << "  " <<  m[1][1] << "|" << endl;
}

#endif
          


TestMatrix2x2.cpp

#include 

#include "Matrix2x2.hpp"

using namespace std;

int main(int argc, char* argv[])
{
    Matrix2x2 X(1,2,3,4);
    Matrix2x2 Y(5,6,7,8);

    cout << "X:" << endl;
    X.Print();

    cout << "Y:" << endl;
    Y.Print();

    Matrix2x2 A = X.Add(Y);
    cout << "A:" << endl;
    A.Print();

    Matrix2x2 B = X.Add(Y);
    cout << "B:" << endl;
    B.Print();
}
          


 

 C++ 普通类和类模板的静态成员变量

普通类的静态成员函数:

#include 

using namespace std;


class XYZ
{
public:
    void putPri();
    static int ipub;
private:
    static int ipri;
};


void XYZ::putPri()
{
    cout << ipri++ << endl;
}

// 静态成员变量初始化:
int XYZ::ipub = 1;
int XYZ::ipri = 1;

main()
{
    XYZ aaa;
    XYZ bbb;

    aaa.putPri();
    cout << aaa.ipub << endl;
    bbb.putPri();
}

类模板的静态成员:

#include 

using namespace std;

template  
class XYZ
{
public:
    void putPri();
    static T ipub;
private:
    static T ipri;
};

template  
void XYZ::putPri()
{
    cout << ipri++ << endl;
}

// 静态成员初始化:
template  T XYZ::ipub = 1;
template  T XYZ::ipri = 1.2;

main()
{
    XYZ aaa;
    XYZ bbb;

    aaa.putPri();
    cout << aaa.ipub << endl;
    bbb.putPri();
}

 C++ 模板的模板参数

#include 
using namespace std;

template