C++—全特化和偏特化

    xiaoxiao2025-10-12  11

    全特化和偏特化

    C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,

    这一点在STL中有着充分的体现。目前,STL在C++社区中得到了广泛的关注、应用和研究。理解和掌握模板

    学习、应用和研究以及扩充STL的基础。而STL模板实例中又充斥着大量的模板特化和偏特化。

    模板特化分为两种:

    全特化和偏特化

    首先我们得先明白一个问题,为什么会有特化这种东西呢?

    因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。

    全特化:

    那我们就用一个例子开始吧:

    [cpp] view plain copy

    template<class T>

    class A

    {

    public:

    A()

    :a(0)

    {}

    ~A()

    {

    cout << "这里走了原始的模板"<< endl;

    }

    protected:

    T a;

    };

    template<>

    class A<int>

    {

    public:

    A()

    :a(0)

    {}

    ~A()

    {

    cout << "这里走了全特化后int的版本" << endl;

    }

    protected:

    int a;

    };

    void test2()

    {

    A<char> a;

    A<int> b;

    }

    我们先看看程序运行的结果:

    我们通过析构函数发现了,A<int> b 走的是我们特化的版本。 而A<char> a走的是原始版本。

    这就是全特化,我们对模板的所有参数进行了特化。如果你想学习C/C++可以来这个群,首先是三三零,中间是八五九,最后是七六六,里面有大量的学习资料可以下载。

    下面是我调试时实例化b的时候,发生的事情,程序走的是int类型特化版本,有图有真相:

    偏特化:

    所谓的偏特化也称局部特化,大家大概明白什么回事了吧。 全特化是所有的模板参数都被进行特化

    ,偏特化也就是局部的参数特化,看看下面这个例子吧:

    [cpp] view plain copy print?

    template <typename T1, typename T2>

    class Data

    {

    public:

    Data();

    private:

    T1 _d1;

    T2 _d2;

    };

    template <typename T1, typename T2>

    Data<T1, T2>::Data()

    {

    cout << "Data<T1, T2>" << endl;

    }

    // 局部特化第二个参数

    template <typename T1>

    class Data <T1, int>

    {

    public:

    Data();

    private:

    T1 _d1;

    int _d2;

    };

    template <typename T1>

    Data<T1, int>::Data()

    {

    cout << "Data<T1, int>" << endl;

    }

    void test2()

    {

    Data<double, int> d1;

    Data<int, double> d2;

    }

    int main()

    {

    test2();

    system("pause");

    return 0;

    }

    我们观察输出的结果:

    我画一张图帮我们理解吧:

    下面我再举个例子,你们说说他是偏特化还是全特化:

    [cpp] view plain copy print?

    template <typename T1, typename T2>

    class Data <T1*, T2*>

    {

    public :

    Data();

    private :

    T1 _d1 ;

    T2 _d2 ;

    T1* _d3 ;

    T2* _d4 ;

    };

    template <typename T1, typename T2>

    Data<T1 *, T2*>:: Data()

    {

    cout<<"Data<T1*, T2*>" <<endl;

    }

    // 局部特化两个参数为引用

    template <typename T1, typename T2>

    class Data <T1&, T2&>

    {

    public :

    Data(const T1& d1, const T2& d2);

    private :

    const T1 & _d1;

    const T2 & _d2;

    T1* _d3 ;

    T2* _d4 ;

    };

    template <typename T1, typename T2>

    Data<T1 &, T2&>:: Data(const T1& d1, const T2& d2)

    : _d1(d1 )

    , _d2(d2 )

    {

    cout<<"Data<T1&, T2&>" <<endl;

    }

    记住这些都是偏特化,这里就要再引出一个概念,偏特化并不仅仅是指特殊部分参数,而是针对模板参数更

    进一步的条件限制所设计出来的一个特化版本。

    最后我在说一个注意事项: 模板的全特化和偏特化都是在已经定义的模板基础之上的,不能单独存在。

    最新回复(0)