天天看点

让后门能够偏特化

让后门函数能够偏特化

在上一篇《​​巧用成员模板函数为你的类留下后门​​》一文中,说了利用成员模板函数方便的扩展类的机制。但这个机制还有一点不足之处,就是不能对这个后门进行偏特化。例如:

    struct cls

    {

       template < typename T, typename U >

       void postern(T& t, U& u)

       {

       }

    };

对这个类cls的后门函数postern,我们只能对它进行全特化。现在的C++还不支持模板函数的偏特化。可是有的时个我们的扩展真的需要偏特化,所以得想点办法来完成这个事情。办法就是把这个后门函数的偏特化需求转换为一个类的偏特化。下面我们来完成这个过程。请看下面的这个类定义。

       //后门函数

       template< typename T, typename U>

       void postern( const T& t, const U& u)

           Cpostern<T,U>::postern(t,u,*this);

    private:

       //一个用来做测试用的私有成员函数

       void fun(void)

           cout << "测试用的私有成员" << endl;

       //内部嵌套的用来对后门函数偏特化的类

       template < typename T, typename U>

       struct Cpostern

           static void postern( const T& t, const U& u ,cls& c)

           {

              c.fun();

              cout << "<>" << __LINE__ << endl;

           }

       };

这个cls类,有三个成员。 一个后门函数postern, 一个私有函数fun, 一个嵌套类Cpostern。现在的后门函数postern只完成一件事情:调用嵌套类Cpostern中的pestern。通过这次调用,我们把偏特化工作由针对函数成功的转向了针对类。现在我们只需偏特化嵌套类Cpostern就行了。例如我们可以做如下的偏特化。

    template <typename T>

    struct cls::Cpostern< T, int>

       static void postern(const T& t, const int& u ,cls& c)

           c.fun();

           cout << "special" << __LINE__ << endl;

同样,我们这次的偏特化没有对原始的cls做一丝一毫的更改。

继续阅读