C++的模板类和函数模板

一.模板类(和类模板一样?)

先看一个正确的例子

#include <iostream>
using namespace std;

template <class T>
class MyType {
public:
    MyType(){t=0;}
    MyType (T ta){t=ta;}
    T getValue();
    MyType operator+(MyType mt1){
        MyType mt;
        mt.t=t+mt1.t;
        return mt;}
private:
    T t;
};

template <class T>
T MyType<T>::getValue()
{
    return t;
}

int main()
{
    MyType<int> s1(10),s2(-5),s3;
    MyType<double> s4(10.3),s5(5.2),s6;
    s3=s1+(s2);
    s6=s4+(s5);
    cout<<"s1.getValue="<<s1.getValue()<<",s2.getValue="<<s2.getValue()<<",s3.getValue="<<s3.getValue()<<endl;
    cout<<"s4.getValue="<<s4.getValue()<<",s5.getValue="<<s5.getValue()<<",s6.getValue="<<s6.getValue()<<endl;
    system("pause");
    return 0;

}

还有一个正确的例子

#include <iostream>
using namespace std;

template <class T>
class A {
public:
    A();
    A(T _a,T _b);
    T sum();
private:
    T a;
    T b;
};

template<class T>
A<T>::A(){a=0;b=0;}

template<class T>
A<T>::A(T _a,T _b){a=_a;b=_b;}

template<class T>
T A<T>::sum(){return (a+b);}

void main()
{
    A <int> ai(3,4);
    A<double> ad(3.1,4.0);
    cout<<ai.sum()<<" "<<ad.sum()<<endl;
}

注意区分返回值或者参数值等何时为T,合适为类名(例1是MyType,例2是A)比如我常犯的错

例1中的

MyType operator+(MyType mt1){
        MyType mt;
        mt.t=t+mt1.t;
        return mt;}

我常会搞混

T operator+(T t1){return (t+t1);}

理论上、语法上也对着,但是main函数中我需要这样调用的

s3=s1+s2;

二.函数模板
在函数中为了针对不同类型数据实现相同功能,通常可能会采用函数重载的功能来实现。例如实现找出两个数中较大的数

//函数1.

int max(int x,int y);
{return(x>y)?x:y ;}

//函数2.
float max( float x,float y){
return (x>y)? x:y ;}

//函数3.
double max(double x,double y)
{return (c>y)? x:y ;}

这样的方法比较冗余而且局限,定义了几种就只能用这几个类型。

引入模板函数

函数模板的一般形式如下:

Template <class或者也可以用typename T>

返回类型 函数名(形参表)
{//
函数定义体 }

说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

例如:

 

#include <iostream>

using std::cout;

using std::endl;


//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,

//T可以被任何字母或者数字代替。

template <class T>

T min(T x,T y)

{ return(x<y)?x:y;}


void main( )

{

     int n1=2,n2=10;

     double d1=1.5,d2=5.6;

     cout<< "较小整数:"<<min(n1,n2)<<endl;

     cout<< "较小实数:"<<min(d1,d2)<<endl;

     system("PAUSE");

}

 

三 非类型模版参数

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

 

template<typename T, int MAXSIZE>

class Stack{
Private:
T elems[MAXSIZE]; … }; Int main() { Stack
<int, 20> int20Stack; Stack<int, 40> int40Stack; … };

 

 

 

 

原文地址:https://www.cnblogs.com/Yogurshine/p/2857843.html