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
< int , char > 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 ;

 

 

 

 

 

 


特别注意:类,全局函数,类的成员函数都可以特化,但是只有类可以半特化,全局函数和类的成员函数不可以半特化。
// -------------------------------------------
// 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)
{

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值