今天在网上看资料时看到这篇文章,感觉不错,收藏下来!
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