C++ template用法
keneyr 人气:0有必要记一下这种一眼看上去就很高级的用法。还是编程不够多。都没用过这个。
相信用过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-------------------------------------------------
加载全部内容