让后门能够偏特化
来源:互联网 发布:linux查看开机启动项 编辑:程序博客网 时间:2024/05/16 07:51
让后门函数能够偏特化
在上一篇《巧用成员模板函数为你的类留下后门》一文中,说了利用成员模板函数方便的扩展类的机制。但这个机制还有一点不足之处,就是不能对这个后门进行偏特化。例如:
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::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做一丝一毫的更改。
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 让后门能够偏特化
- 特化和偏特化
- 特化 偏特化
- 特化和偏特化
- 特化和偏特化
- 特化和偏特化
- 模版特化 偏特化
- 模板特化,全特化,偏特化,全部特化,部分特化
- 模板特化和偏特化
- 模板特化和偏特化
- 模板特化和偏特化
- 用GDB调试程序(二)
- 将XForm集成到你的工作流引擎里面
- SQL SERVER 2000 中的标识值获取函数
- Silverlight的中文显示问题
- 用GDB调试程序(一)
- 让后门能够偏特化
- 一种实际的MDA方法--Lightweight Domain Specific Modeling
- 连接PHP和 Java -- PHP/Java Bridge [2]
- 应用式数据库 VS 集成式数据库
- SQL Server 2005 中的树形数据处理示例-2
- 巧用成员模板函数为你的类留下后门
- 免费的Maven 2 电子书下载
- Inside i++
- 让自定义的类型可以和任意的类型之间转换