让后门函数能够偏特化
在上一篇《巧用成员模板函数为你的类留下后门》一文中,说了利用成员模板函数方便的扩展类的机制。但这个机制还有一点不足之处,就是不能对这个后门进行偏特化。例如:
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做一丝一毫的更改。