c++中的template理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keneyr/article/details/89195070

有必要记一下这种一眼看上去就很高级的用法。还是编程不够多。都没用过这个。


相信用过c++的人,即便没用过,也肯定都听说过模板类这个词。嗨不巧了,今天讲的就是模板类。

模板是c++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。因此可以说,模板是一种对类型进行参数化的工具

template<class T>  和  template<typename T> 都可以用来定义函数模板类模板,在使用上,他们俩没有本质的区别。

函数模板针对仅参数类型不同的函数;类模板针对仅数据成员和成员函数类型不同的类。

Note:模板的声明或定义只能在全局,命名空间或类范围内进行。不能再局部范围,函数内进行。

一、函数模板

template< class 形参名,class 形参名,......> 返回类型 函数名(参数列表)   { 函数体 }

举个例子:template <class T> void swap(T& a,T& b){}

当调用这样的模板函数时,类型T就会被调用时的类型所代替。如果swap(a, b),a,b都是int类型,那么模板函数swap中的形参T就会被int所代替,模板函数就会变成swap(int &a,int &b)。而当swap(a,b),a,b都是double类型,那么模板函数swap中的形参T就会被double所代替,模板函数就会变成swap(double &a,double &b),这样如果我们的程序中交换变量的值就不再受限于类型了。

二、类模板

template< class 形参名,class 形参名,......> class 类名 {...};

举个例子:template <class T> class A { public:   T a; T b;   T hy(T c, T &d); };

在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。

不讲太难的,恩太难的我也不会啊。就写个简单的例子把,对我足够了:

TemplateDemo.h

#ifndef TEMPLATE_DEMO_HXX
#define TEMPLATE_DEMO_HXX 

template<class T> class A{
     public:
         T g(T a,T b);
         A();
 };
 
#endif

TemplateDemo.cpp

#include<iostream.h>
#include "TemplateDemo.h" 
template<class T> A<T>::A(){}
 
template<class T> T A<T>::g(T a,T b){
     return a+b;
}
 
void main(){
     A<int> a;
     cout<<a.g(2,3.2)<<endl;

-----------------------------------------------------------------以下可不看-----------------------------------------

现在再看的Kinect的那个代码:

stdafx.h

template<class Interface>

inline void SafeRelease(Interface *& pInterfaceToRelease)
{
    if (pInterfaceToRelease != NULL)
    {
        pInterfaceToRelease->Release();
        pInterfaceToRelease = NULL;
    }
}

很显然是声明了函数模板,Interface是一种自定义的类型:

BodyBasics.cpp

#include "stdafx.h"

...

CBodyBasics::~CBodyBasics()
{
    DiscardDirect2DResources();

    // clean up Direct2D
    SafeRelease(m_pD2DFactory);

    // done with body frame reader
    SafeRelease(m_pBodyFrameReader);

    // done with coordinate mapper
    SafeRelease(m_pCoordinateMapper);

    // close the Kinect Sensor
    if (m_pKinectSensor)
    {
        m_pKinectSensor->Close();
    }

    SafeRelease(m_pKinectSensor);
}

很显然ID2D1Factory是一个接口。

-----------------------------------------END-------------------------------------------------

参考博客:https://www.cnblogs.com/yuzhuwei/p/4171070.html

                 https://blog.csdn.net/biu__biu_biu/article/details/78020620

猜你喜欢

转载自blog.csdn.net/keneyr/article/details/89195070