在C++中类可以partially specialize,但是函数不行。
template <class T, class U>
T* Create(const U& arg)
{
return new T(arg);
}
下面这样partially specialize一个模版函数是不可以的。
template <class U>
Widget* Create<Widget, U>(const U& arg)
{
return new Widget(arg, -1);
}
解决这个问题可以用一个trick,在MCD中有云
template <typename T>
struct Type2Type
{
typedef T OriginalType;
};
定义这个类
现在可以了:
// An implementation of Create relying on overloading
// and Type2Type
template <class T, class U>
T* Create(Type2Type<T>, const U& arg){
return new T(arg);
}
template <class U>
Widget* Create(Type2Type<Widget>, const U& arg)
{
return new Widget(arg, -1);
}
// Use Create()
string* pStr = Create(Type2Type<string>(), "Hello");
Widget* pW = Create(Type2Type<Widget>(), 100);
Trick is over...