就是这样个结构:
template <typename T>
struct Type2Type
{
typedef T OriginalType;
};
假定有个片断如下创建个T*
template < T, U>
T* Create(const U& arg)
{
T(arg);
}
如果对于某个类如“Widget”其ctor要有两个参数比如第 2个参数必须是-1(对于旧代码来说谁知道呢:))但又不想另外创建个“CreateWidget”思路方法那么如何办呢是不能偏特化即如下代码:
//代码
template < U>
Widget* Create<Widget,U>(const U& arg)
{
Widget(arg,-1);
}在 VC7下会报告:非法使用显式模板参数
只能使用重载比如:
template < T, U>
T* Create(const U&arg,T /*虚拟*/)
{
T(arg);
}
template < U>
Widget * Create(const U& arg, Widget /*虚拟*/)
{
Widget(arg,-1);
}
这样是可以解决问题但最大毛病在于运行时构造了 未被使用对象这个开销(虚拟Widget参数)这时 Type2Type 这个咚咚出场了按照书说法这是“个型别代表物、个可以让你传给重载轻量级ID”如下:
template < T, U>
T* Create(const U& arg,Type2Type<T>)
{
T(arg);
}
template < U>
Widget * Create(const U& arg,Type2Type<Widget>)
{
Widget(arg,-1);
}
方:
String *pStr = Create("hello",Type2Type<String>);
Widget *pW = Create(100,Type2Type<Widget>);
关键是这个东西也是给编译器看妙
最新评论