Template的特性浅析

来源:互联网 发布:钉钉软件的优缺点 编辑:程序博客网 时间:2024/04/29 04:56

今天在网上看资料时看到这篇文章,感觉不错,收藏下来!

Template 是 泛型编程和STL中很基本的概念,下面让我们来看看它都有哪些新特性:



1. 类模板显示特化(class template explicit specialization )
   template<class T>
    struct CTest{
          void operator() (){cout<<"CTest<T>"<<endl;}
    };
   
    struct CTest<char>{
         void operator() (){cout<<"CTest<char>"<<endl;}
   };
 
    struct CTest<int> {
         void operator() (){cout<<"CTest<int>"<<endl;}
   };
   void main()
   {
         CTest<double> test1;
         CTest<char> test2;
         CTest<int> test3;
 
         test1();
         test2();
         test3();
    }
Answer:
  CTest<T>
  CTest<char>
  CTest<int>
 
 
1.      类模板偏特化(class template partial specialization)
 template<class T1, class T2>
 struct CTest{
  CTest(){cout<<"T1,T2"<<endl;}
 };
 
 template<class T>
 struct CTest<T*, T*>{
 CTest(){cout<<"T*,T*"<<endl;}
};
 
 template<class T>
 struct CTest<const T*, T*>{
 CTest(){cout<<"const T*,T*"<<endl;}
};
 
void main()
{
    CTest<char,int> test1;
    CTest<int*,int*>test2;
    CTest<const int*,int*>test3;
}
Answer:
T1,T2
T*,T*
const T*,T*
 
2.      默认模板参数
根据前一个模板参数T,设定下一个模板参数
 
class alloc{};
template<class T,class Alloc= alloc,size_t BufSize = 0>
class queue{
public:
   queue(){cout<<"queue"<<endl;}
};
 
template<class T, class sequence = deque<T>>
class stack{
public:
    stack(){cout<<"stack"<<endl;}
private:
    sequence s;
};
 
void main()
{
   stack<int> x;
}
Answer:
deque
stack
 
4. 成员模板(member template)
模板类的成员函数可以是一个模板
template<class T>
class vector{
public:
template<class I>
void insert(I first,I last)
{
   cout<<"insert"<<endl;
}
};
int main()
{
   int ia[5]={0,1,2,3,4};
   vector<int>x;
   x.insert(ia,ia+5);
}
Answer:
insert
5.      关键字 typename
做为类型前的标识符号。
指出SubType是T中定义的一个类型,因此ptr是一个指向T:SubType的指针。
如果不加typename,表达式被认为是T中的静态成员SubType和ptr的乘积。
template<class T>
class MyClass
{
typename T::subType * ptr;
};
C++的一般规则是,除了以typename修饰以外,template内的任何标识符号都被视为一个值(value),而非一个类型(type)。
 
typename的第二个作用:在模板声明中替换关键字class

template<typename T> class MyClass ...


原文出处:http://blog.csdn.net/liangjingbo/article/details/2212913

0 0
原创粉丝点击