c++模板

1.类模板及其(全)特化和偏特化

模板特化是通过"给模板中的所有模板参数一个具体的类"的方式来实现的.而模板偏特化则是通过"给模板中的部分模板参数以具体的类,而留下剩余的模板参数仍然使用原来的泛化定义"的方式来实现。


/*类模板的特化*/
template<>  class compare<char*,char>{  
public:  
    void printType(char* t1,char t2){  
        cout << "all specialization" << endl;
        cout << typeid(t1).name() << endl;  
  cout << typeid(t2).name() << endl;  
   cout << "-----------------------" << endl;
   }  
};

/*类模板的偏特化*/
template<typename T2>  class compare<char*,T2>{  
public:  
    void printType(char* t1,T2 t2){  
        cout << "1st partial specialization" << endl;
        cout << typeid(t1).name() << endl;  
  cout << typeid(t2).name() << endl;  
  cout << "-----------------------" << endl;
    }  
};
template<typename T1>  class compare<T1,char*>{  
public:  
    void printType(char* t2,T1 t1){  
        cout << "2nd partial specialization" << endl;
        cout << typeid(t2).name() << endl;  
  cout << typeid(t1).name() << endl;  
  cout << "-----------------------" << endl;
    }  
};
 
 /*类模板及特化测试代码*/
 compare<int,double> c1;
 compare<char*,char> c2;
 compare<char*,long> c3;
 compare<double,char*> c4;
 c1.printType(5,2.3);
 c2.printType("ab",'a');
 c3.printType("ab",12343);
 c4.printType("ab",238.212);

2.函数模板及特化

/*函数模板*/
template <typename T> T mymax(const T t1, const T t2)
{
    return t1 < t2 ? t2 : t1;
}
/*函数模板特化*/
template <> const char* mymax(const char* t1,const char* t2)
{
    return (strcmp(t1,t2) < 0) ? t2 : t1;
}
 
 /**函数模板及特化测试代码*/
 int highest = mymax(5,10);
 char c = mymax('a', 'z');
 const char* p1 = "hello";
 const char* p2 = "world";
 const char* p = mymax(p1,p2);

严格的来说,函数模板并不支持偏特化,但由于可以对函数进行重载,所以可以达到类似于类模板偏特化的效果。

   template <class T> void f(T);   (a)

   根据重载规则,对(a)进行重载

   template < class T> void f(T*);   (b)

   如果将(a)称为基模板,那么(b)称为对基模板(a)的重载,而非对(a)的偏特化。C++的标准委员会仍在对下一个版本中是否允许函数模板的偏特化进行讨论。

 

3.成员模板函数及特化

class A
{
private:
   int a;
public:
   template<typename T>    void show(T t1); //成员模板函数声明
   template<>    void show<int>(int t1);  //成员模板函数特化声明
};
 
/*成员模板函数定义*/
template<typename T> void A::show(T t1)
{
   cout << "normal member template function" << endl;
   cout << t1 << endl;
}
/*成员模板函数特化定义*/
template<> void A::show<int>(int t1)
{
   cout << "member template function specialization" << endl;
   cout << t1 << endl;
}
 
 /*成员模板函数及特化测试代码*/
 A a;
 a.show("abd");
 a.show(5);

成员模板函数的声明和定义最好都写在头文件中,否则有些编译器可能会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值