美文网首页
偏特化 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