天天看點

讓後門能夠偏特化

讓後門函數能夠偏特化

在上一篇《​​巧用成員模闆函數為你的類留下後門​​》一文中,說了利用成員模闆函數友善的擴充類的機制。但這個機制還有一點不足之處,就是不能對這個後門進行偏特化。例如:

    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做一絲一毫的更改。

繼續閱讀