C++模板实例掌握

简介:

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

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

// 1. 模板类静态成员
template  < typename T >   struct  testClass 

    
static int _data; 
}

template
<>   int  testClass < char > ::_data  =   1
template
<>   int  testClass < long > ::_data  =   2
int  main(  void  ) 
    cout 
<< boolalpha << (1==testClass<char>::_data) << endl; 
    cout 
<< boolalpha << (2==testClass<long>::_data) << endl; 
}
 

// 2. 模板类偏特化 
template  < class  I,  class  O >   struct  testClass 

    testClass() 
{ cout << "I, O" << endl; } 
}

template 
< class  T >   struct  testClass < T * , T *>  

    testClass() 
{ cout << "T*, T*" << endl; } 
}

template 
< class  T >   struct  testClass < const  T * , T *>  

    testClass() 
{ cout << "const T*, T*" << endl; } 
}

int  main(  void  ) 

    testClass
<intchar> obj1; 
    testClass
<int*int*> obj2; 
    testClass
<const int*int*> obj3; 
}
 

// 3.类模版+函数模版
template  < class  T >   struct  testClass 

    
void swap( testClass<T>& ) { cout << "swap()" << endl; } 
}

template 
< class  T >  inline  void  swap( testClass < T >&  x, testClass < T >&  y ) 

    x.swap( y ); 
}
 
int  main(  void  )

    testClass
<int> obj1; 
    testClass
<int> obj2; 
    swap( obj1, obj2 ); 
}
 


// 4. 类成员函数模板 
struct  testClass

    template 
<class T> void mfun( const T& t )
    

        cout 
<< t << endl; 
    }
 
    template 
<class T> operator T() 
    

        
return T(); 
    }
 
}

int  main(  void  ) 

    testClass obj; 
    obj.mfun( 
1 ); 
    
int i = obj; 
    cout 
<< i << endl; 
}
 

// 5. 缺省模板参数推导 
template  < class  T >   struct  test 

    T a; 
}

template 
< class  I,  class  O = test < I >   >   struct  testClass 

    I b; 
    O c; 
}


void  main()
{
}



// 6. 非类型模板参数 
template  < class  T,  int  n >   struct  testClass 
    T _t; 
    testClass() : _t(n) 

    }
 
}

int  main(  void  ) 
    testClass
<int,1> obj1; 
    testClass
<int,2> obj2; 
}
 


// 7. 空模板参数 
template  < class  T >   struct  testClass; 
template 
< class  T >   bool   operator == const  testClass < T >& const  testClass < T >&  ) 

    
return false
}

template 
< class  T >   struct  testClass 

    friend 
bool operator== <>const testClass&const testClass& ); 
}

void  main()
{
}


// 8. template template 类
struct  Widget1 

template
<typename T> 
    T foo()
{} 
}


template
< template < class  T > class  X >  
struct  Widget2

}

void  main()
{
    cout
<< 3 << '\n';
}




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

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

// -------------------------------------------
// 1 类的特化和类成员函数的特化
template < typename T >
class  Widget1
{
public:
    
void Fun1()
    
{
        
//generic implementation
    }

    
}
;

template
<>
class  Widget1 < int >
{
public:
    
void Fun1()
    
{
    }

}
;
template
<>  
void  Widget1 < char > ::Fun1()
{
    
//specialization
}


void  main()


  Widget1
<char> w;
  w.Fun1();
  Widget1
<int> w2;
  w2.Fun1();
  
}

// -------------------------------------------
// 2 全局函数的特化和重载
template < typename T1, typename T2 >
T1 Fun2(T2)
{
}


// 下面2个应该是属于重载
template < typename T2 >
char  Fun2(T2)
{
    
char c;
    
return c;
}


template
< typename T1 >
T1 Fun2(
char )
{
}


// 全局函数的特化
template <>
char  Fun2 < char , int > ( int )
{
    
char c;
    
return c;
}

int  main()
{
}

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


template 
< typename T1 >
void  Test < T1,T1 > (T1,T1)
{
}


template
< typename T1, typename T2 >   // 原型2
T1 Fun2(T2)
{
}

//
template < typename T2 >
int  Fun2 < int ,T2 > (T2)
{
}

template
< typename T1 >
T1 Fun2
< T1, int > ( int )
{
}

template
< typename T >
T Fun2
< T,T > (T)
{
}

int  main()
{
}



////-------------------------------------------
////4 类可以特化和半特化,但是特的成员函数像全局函数一样,只能特化,不能半特化,

template < typename T1, typename T2 >   struct  Widget2
{
  
void Fun2()
  
{
      
//generic implementation
  }

}
;

template
< typename T2 >  
struct  Widget2 < char ,T2 >
{
    
void Fun2()
    
{
    }

}
;

template
< typename T2 >
struct  widget2
{
    
void Fun2()
    
{
        
// class partial specialization
    }

}
;



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

int  main()
{
}

 

参考:C++编程思想2

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





本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3257079.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
C语言
C 练习实例7
C 练习实例7.
17 4
|
2月前
C实例1
C实例1。
15 3
|
4月前
C 练习实例6
C 练习实例6。
187 3
|
5月前
C 练习实例1
C 练习实例1
30 1
|
5月前
C 练习实例2
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成双精度浮点(double)型。
36 1
|
5月前
|
机器学习/深度学习
C 练习实例3
C 练习实例3。
38 7
|
2月前
C 实例2
C 实例2。
12 3
|
4月前
C练习实例11
C练习实例11。
22 1
|
4月前
C 练习实例11
C 练习实例11。
24 1
|
4月前
C练习实例9
C练习实例9
21 0