通常定义模板类如下:
template<class T> class TestPartial{};
这个泛化版本允许接受T为任何型别,如:
TestPartial<int>、TestPartial<int>、TestPartial<const int>、TestPartial<const int&>
等等 ,这是因为缺省了<>偏特化的设定。如:
template<class T> class TestPartial<T*> {};
这个特化版本仅适用于“T为原生指针”的情况。有了这项利器,我们便可 以解决内嵌型别未能解决的问题(下节详解)。
// class template partial specialization -- 偏特化
// 一般化设计
template<class T>
struct TestPartial // 缺省偏特化的类型值表现,会把剩下的都按这个模板来适配
{
TestPartial() { std::cout << "T" << std::endl; };
};
// 特殊化设计
template<class T>
struct TestPartial<T*>
{
TestPartial() { std::cout << "T*" << std::endl; };
};
// 特殊化设计
template<class T>
struct TestPartial<const T>
{
TestPartial() { std::cout << "const T" << std::endl; };
};
// 特殊化设计
template<class T>
struct TestPartial<const T*>
{
TestPartial() { std::cout << "const T*" << std::endl; };
};
// 特殊化设计
template<class T>
struct TestPartial<const T&>
{
TestPartial() { std::cout << "const T&" << std::endl; };
};
int main(int agrv,char* agrc)
{
TestPartial<int> ad;
TestPartial<int*> ad1;
TestPartial<const int> ad2;
TestPartial<int&> ad3;
return 0;
}
运行输出:
T
T*
const T
T
后续
当你想知道别人传入的迭代器的原始值的类型,但又不知道传入的T是何种类型(可能是T、T*、T&),这时候我们就要萃取出原T的value_type、difference_type、pointer、reference、iterator_categor。
template<class I>
struct iterator_traits {
typedef typename I::value_type value_type;
}
网友评论