讓後門函數能夠偏特化
在上一篇《巧用成員模闆函數為你的類留下後門》一文中,說了利用成員模闆函數友善的擴充類的機制。但這個機制還有一點不足之處,就是不能對這個後門進行偏特化。例如:
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做一絲一毫的更改。