美文网首页
偏特化 template partial specializat

偏特化 template partial specializat

作者: 高斯_Cpper | 来源:发表于2018-08-09 14:48 被阅读0次
通常定义模板类如下:

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;
}

相关文章

网友评论

      本文标题:偏特化 template partial specializat

      本文链接:https://www.haomeiwen.com/subject/njoqbftx.html