让后门函数能够偏特化
struct cls
{
template < typename T, typename U >
void postern(T& t, U& u)
{
}
};
对这个类cls的后门函数postern,我们只能对它进行全特化。现在的C++还不支持模板函数的偏特化。可是有的时个我们的扩展真的需要偏特化,所以得想点办法来完成这个事情。办法就是把这个后门函数的偏特化需求转换为一个类的偏特化。下面我们来完成这个过程。请看下面的这个类定义。
struct cls
{
//后门函数
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做一丝一毫的更改。
查看本文来源