标签:
* 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载。这在一定程度上实现了宏(macro)的作用。它们的原型定义可以是下面两种中的任何一个:
上面两种原型定义的不同之处在关键字class 或 typename的使用。它们实际是完全等价的,因为两种表达的意思和执行都一模一样
<pre class="cpp" name="code">int Add(const int &_iLeft, const int &_iRight) { return (_iLeft + _iRight); } float Add(const float &_fLeft, const float &_fRight) { return (_fLeft + _fRight); }
<pre class="cpp" name="code">template<typename T> inline T Add(const T _left, const T _right) { return (_left + _right); }
<pre class="cpp" name="code">template<class T, U, typename V> void f1(T, U, V); template<class T> T f2(int &T); template<class T> T f3 (T, T); typedef int TYPENAME; template<typename TYPENAME> TYPENAME f4(TYPENAME);
const int iByteCnt = 9; int b[iByteCnt+1]; int a[10]; FunTest(a); // FunTest<int, 10> 两个数组等价 FunTest(b); // FunTest<int, 10> 编译器不会合成新的函数
<pre class="cpp" name="code">int Max(const int& left, const int & right) { return left>right? left:right; } template<typename T> T Max(const T& left, const T& right) { return left>right? left:right; } template<typename T> T Max(const T& a, const T& b, const T& c) { return Max(Max(a, b), c); }; int main() { Max(10, 20, 30); Max<>(10, 20); Max(10, 20); Max(10, 20.12); Max<int>(10.0, 20.0); Max(10.0, 20.0); return 0; }
<span style="color:#993399;">int compare(int v1, int v2) { return 0; } </span>
typedef int DataType; //typedef char DataType; class SeqList { private : DataType* _data ; int _size ; int _capacity ; };
<pre class="cpp" name="code">template<class 形参名1, class 形参名2, ...class 形参名n> class 类名 { ... }; template<typename T> class SeqList { private : T* _data ; int _size ; int _capacity ; }; // 以模板方式实现动态顺序表 template<typename T> class SeqList { public : SeqList(); ~ SeqList(); private : int _size ; int _capacity ; T* _data ; }; template <typename T> SeqList <T>:: SeqList() : _size(0) , _capacity(10) , _data(new T[ _capacity]) {} template <typename T> SeqList <T>::~ SeqList() { delete [] _data ; } void test1 () { SeqList<int > sl1; SeqList<double > sl2; }
<pre class="cpp" name="code">template <typename T> class SeqList { private : int _size ; int _capacity ; T* _data ; }; // template <class T, class Container> template <class T, class Container = SeqList<T> > // 缺省参数 class Stack { public : void Push (const T& x); void Pop (); const T& Top(); bool Empty (); private : Container _con ; }; void Test() { Stack<int> s1; Stack<int , SeqList<int>> s2 ; // 思考下面这种使用场景会怎样? Stack<int , SeqList<char>> s3 ; }
<pre class="cpp" name="code">template <typename T> class SeqList { private : int _size ; int _capacity ; T* _data ; }; // template <class T, template<class> class Container> template <class T, template<class> class Container = SeqList> // 缺省参数 class Stack { public : void Push(const T& x ); void Pop(); const T& Top(); bool Empty(); private : Container<T > _con; }; void Test() { Stack<int> s1; Stack<int , SeqList> s2; }
<pre class="cpp" name="code">//template<typename T, size_t MAX_SIZE> template <typename T, size_t MAX_SIZE = 10> //带缺省模板参数 class SeqList { public : SeqList(); private : T _array [MAX_SIZE]; int _size ; }; template <typename T, size_t MAX_SIZE> SeqList <T, MAX_SIZE>::SeqList() : _size(0) {} void Test() { SeqList<int> s1; SeqList<int , 20> s2; }
<pre class="cpp" name="code">//template<class T, string name> template <class T, double MaxSize> class Test { private : double _value ; };
<pre class="cpp" name="code">template <typename T> class SeqList { public : SeqList(); ~ SeqList(); private : int _size ; int _capacity ; T* _data ; }; template<typename T> SeqList <T>:: SeqList() : _size(0) , _capacity(10) , _data(new T[ _capacity]) { cout<<"SeqList<T>" <<endl; } template<typename T> SeqList <T>::~ SeqList() { delete[] _data ; } template <> class SeqList <int> { public : SeqList(int capacity); ~ SeqList(); private : int _size ; int _capacity ; int* _data ; }; // 特化后定义成员函数不再需要模板形参 SeqList <int>:: SeqList(int capacity) : _size(0) , _capacity(capacity ) , _data(new int[ _capacity]) { cout<<"SeqList<int>" <<endl; } // 特化后定义成员函数不再需要模板形参 SeqList <int>::~ SeqList() { delete[] _data ; } void test1 () { SeqList<double > sl2; SeqList<int > sl1(2); }
<pre class="cpp" name="code">template <typename T1, typename T2> class Data { public : Data(); private : T1 _d1 ; T2 _d2 ; }; template <typename T1, typename T2> Data<T1 , T2>::Data() { cout<<"Data<T1, T2>" <<endl; } // 局部特化第二个参数 template <typename T1> class Data <T1, int> { public : Data(); private : T1 _d1 ; int _d2 ; }; template <typename T1> Data<T1 , int>::Data() { cout<<"Data<T1, int>" <<endl; }
<pre class="cpp" name="code">template <typename T1, typename T2> class Data <T1*, T2*> { public : Data(); private : T1 _d1 ; T2 _d2 ; T1* _d3 ; T2* _d4 ; }; template <typename T1, typename T2> Data<T1 *, T2*>:: Data() { cout<<"Data<T1*, T2*>" <<endl; } // 局部特化两个参数为引用 template <typename T1, typename T2> class Data <T1&, T2&> { public : Data(const T1& d1, const T2& d2); private : const T1 & _d1; const T2 & _d2; T1* _d3 ; T2* _d4 ; }; template <typename T1, typename T2> Data<T1 &, T2&>:: Data(const T1& d1, const T2& d2) : _d1(d1 ) , _d2(d2 ) { cout<<"Data<T1&, T2&>" <<endl; } void test2 () { Data<double , int> d1; Data<int , double> d2; Data<int *, int*> d3; Data<int&, int&> d4(1, 2); }
标签:
原文地址:http://blog.csdn.net/yc2zgh1314/article/details/51236302