C++模板实例掌握

前段时间重新学习C++,主要看C++编程思想和C++设计新思维。对模版的使用有了更进一层的了解,特总结如下:

下面列出了模版的常用情况:

C++模板实例掌握//1. 模板类静态成员
C++模板实例掌握
template <typename T> struct testClass
C++模板实例掌握
{
C++模板实例掌握   
static int _data;
C++模板实例掌握}
;
C++模板实例掌握template
<> int testClass<char>::_data = 1;
C++模板实例掌握template
<> int testClass<long>::_data = 2;
C++模板实例掌握
int main( void ) {
C++模板实例掌握    cout
<< boolalpha << (1==testClass<char>::_data) << endl;
C++模板实例掌握    cout
<< boolalpha << (2==testClass<long>::_data) << endl;
C++模板实例掌握}
 
C++模板实例掌握
C++模板实例掌握
//2. 模板类偏特化
C++模板实例掌握
template <class I, class O> struct testClass
C++模板实例掌握
{
C++模板实例掌握    testClass()
{ cout << "I, O" << endl; } 
C++模板实例掌握}
;
C++模板实例掌握template
<class T> struct testClass<T*, T*> 
C++模板实例掌握
{
C++模板实例掌握    testClass()
{ cout << "T*, T*" << endl; } 
C++模板实例掌握}
;
C++模板实例掌握template
<class T> struct testClass<const T*, T*> 
C++模板实例掌握
{
C++模板实例掌握    testClass()
{ cout << "const T*, T*" << endl; } 
C++模板实例掌握}
;
C++模板实例掌握
int main( void )
C++模板实例掌握
{
C++模板实例掌握    testClass
<int, char> obj1;
C++模板实例掌握    testClass
<int*, int*> obj2;
C++模板实例掌握    testClass
<const int*, int*> obj3;
C++模板实例掌握}
 
C++模板实例掌握
C++模板实例掌握
//3.类模版+函数模版
C++模板实例掌握template <class T> struct testClass
C++模板实例掌握
{
C++模板实例掌握   
void swap( testClass<T>& ) { cout << "swap()" << endl; } 
C++模板实例掌握}
;
C++模板实例掌握template
<class T> inline void swap( testClass<T>& x, testClass<T>& y )
C++模板实例掌握
{
C++模板实例掌握    x.swap( y );
C++模板实例掌握}
 
C++模板实例掌握
int main( void )
C++模板实例掌握
{
C++模板实例掌握    testClass
<int> obj1;
C++模板实例掌握    testClass
<int> obj2;
C++模板实例掌握    swap( obj1, obj2 );
C++模板实例掌握}
 
C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
//4. 类成员函数模板
C++模板实例掌握
struct testClass
C++模板实例掌握
{
C++模板实例掌握    template
<class T> void mfun( const T& t )
C++模板实例掌握   
{
C++模板实例掌握        cout
<< t << endl;
C++模板实例掌握    }
 
C++模板实例掌握    template
<class T> operator T()
C++模板实例掌握   
{
C++模板实例掌握       
return T();
C++模板实例掌握    }
 
C++模板实例掌握}
;
C++模板实例掌握
int main( void )
C++模板实例掌握
{
C++模板实例掌握    testClass obj;
C++模板实例掌握    obj.mfun(
1 );
C++模板实例掌握   
int i = obj;
C++模板实例掌握    cout
<< i << endl;
C++模板实例掌握}
 
C++模板实例掌握
C++模板实例掌握
//5. 缺省模板参数推导
C++模板实例掌握
template <class T> struct test
C++模板实例掌握
{
C++模板实例掌握    T a;
C++模板实例掌握}
;
C++模板实例掌握template
<class I, class O=test<I> > struct testClass
C++模板实例掌握
{
C++模板实例掌握    I b;
C++模板实例掌握    O c;
C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握
void main()
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
//6. 非类型模板参数
C++模板实例掌握
template <class T, int n> struct testClass {
C++模板实例掌握    T _t;
C++模板实例掌握    testClass() : _t(n)
{
C++模板实例掌握    }
 
C++模板实例掌握}
;
C++模板实例掌握
int main( void ) {
C++模板实例掌握    testClass
<int,1> obj1;
C++模板实例掌握    testClass
<int,2> obj2;
C++模板实例掌握}
 
C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
//7. 空模板参数
C++模板实例掌握
template <class T> struct testClass;
C++模板实例掌握template
<class T> bool operator==( const testClass<T>&, const testClass<T>& )
C++模板实例掌握
{
C++模板实例掌握   
return false;
C++模板实例掌握}
;
C++模板实例掌握template
<class T> struct testClass
C++模板实例掌握
{
C++模板实例掌握    friend
bool operator== <>( const testClass&, const testClass& );
C++模板实例掌握}
;
C++模板实例掌握
void main()
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
//8. template template 类
C++模板实例掌握
struct Widget1
C++模板实例掌握
{
C++模板实例掌握template
<typename T> 
C++模板实例掌握    T foo()
{} 
C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握template
<template<class T>class X> 
C++模板实例掌握
struct Widget2
C++模板实例掌握
{
C++模板实例掌握}
;
C++模板实例掌握
void main()
C++模板实例掌握
{
C++模板实例掌握    cout
<< 3 << '\n';
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
C++模板实例掌握


//参考:http://www.cnblogs.com/dayouluo/archive/2005/05/14/155092.html

特别注意:类,全局函数,类的成员函数都可以特化,但是只有类可以半特化,全局函数和类的成员函数不可以半特化。

C++模板实例掌握//-------------------------------------------
C++模板实例掌握
//1 类的特化和类成员函数的特化
C++模板实例掌握
template<typename T>
C++模板实例掌握
class Widget1
C++模板实例掌握
{
C++模板实例掌握
public:
C++模板实例掌握   
void Fun1()
C++模板实例掌握   
{
C++模板实例掌握       
//generic implementation
C++模板实例掌握
    }

C++模板实例掌握   
C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握template
<>
C++模板实例掌握
class Widget1<int>
C++模板实例掌握
{
C++模板实例掌握
public:
C++模板实例掌握   
void Fun1()
C++模板实例掌握   
{
C++模板实例掌握    }

C++模板实例掌握}
;
C++模板实例掌握template
<> 
C++模板实例掌握
void Widget1<char>::Fun1()
C++模板实例掌握
{
C++模板实例掌握   
//specialization
C++模板实例掌握
}

C++模板实例掌握
C++模板实例掌握
void main()
C++模板实例掌握
{
C++模板实例掌握
C++模板实例掌握  Widget1
<char> w;
C++模板实例掌握  w.Fun1();
C++模板实例掌握  Widget1
<int> w2;
C++模板实例掌握  w2.Fun1();
C++模板实例掌握 
C++模板实例掌握}

C++模板实例掌握
//-------------------------------------------
C++模板实例掌握
//2 全局函数的特化和重载
C++模板实例掌握
template<typename T1, typename T2>
C++模板实例掌握T1 Fun2(T2)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
//下面2个应该是属于重载
C++模板实例掌握
template<typename T2>
C++模板实例掌握
char Fun2(T2)
C++模板实例掌握
{
C++模板实例掌握   
char c;
C++模板实例掌握   
return c;
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握template
<typename T1>
C++模板实例掌握T1 Fun2(
char)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
//全局函数的特化
C++模板实例掌握
template<>
C++模板实例掌握
char Fun2<char,int>(int)
C++模板实例掌握
{
C++模板实例掌握   
char c;
C++模板实例掌握   
return c;
C++模板实例掌握}

C++模板实例掌握
int main()
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
//-------------------------------------------
C++模板实例掌握
//3 全局函数不能半特化,以下编译失败
C++模板实例掌握
template <typename T1,typename T2> //原型1
C++模板实例掌握
void Test(T1,T2)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握template
<typename T1>
C++模板实例掌握
void Test<T1,T1>(T1,T1)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握template
<typename T1, typename T2> //原型2
C++模板实例掌握
T1 Fun2(T2)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
//
C++模板实例掌握
template<typename T2>
C++模板实例掌握
int Fun2<int,T2>(T2)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握template
<typename T1>
C++模板实例掌握T1 Fun2
<T1,int>(int)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握template
<typename T>
C++模板实例掌握T Fun2
<T,T>(T)
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
int main()
C++模板实例掌握
{
C++模板实例掌握}

C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
////-------------------------------------------
C++模板实例掌握
////4 类可以特化和半特化,但是特的成员函数像全局函数一样,只能特化,不能半特化,

C++模板实例掌握template<typename T1, typename T2> struct Widget2
C++模板实例掌握
{
C++模板实例掌握 
void Fun2()
C++模板实例掌握 
{
C++模板实例掌握     
//generic implementation
C++模板实例掌握
  }

C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握template
<typename T2> 
C++模板实例掌握
struct Widget2<char,T2>
C++模板实例掌握
{
C++模板实例掌握   
void Fun2()
C++模板实例掌握   
{
C++模板实例掌握    }

C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握template
<typename T2>
C++模板实例掌握
struct widget2
C++模板实例掌握
{
C++模板实例掌握   
void Fun2()
C++模板实例掌握   
{
C++模板实例掌握       
// class partial specialization
C++模板实例掌握
    }

C++模板实例掌握}
;
C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
C++模板实例掌握
//the class member funtion can not be partial specialization
C++模板实例掌握
//以下的成员函数半特化,编译失败
C++模板实例掌握
template<typename T2>
C++模板实例掌握
void Widget2<char, T2>::Fun2()
C++模板实例掌握
{
C++模板实例掌握   
//class member function partial specialization
C++模板实例掌握
}

C++模板实例掌握
int main()
C++模板实例掌握
{
C++模板实例掌握}

 

参考:C++编程思想2

http://www.cnblogs.com/feisky/archive/2009/11/04/1596203.html

C++模板实例掌握
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

上一篇:二十个一乘以二十个二等于多少?C语言经典算法设计之大数乘法


下一篇:采用归并排序算法查找两个字符串数组中的不同数据