一、常整数映射为型别
Alexandrescu提出的简单而有用的template
template <int v>
struct Int2Type
{
enum { value = v };
};
template <typename T, bool isPolymorphic>
class NiftyContainer
{
private:
void DoSomething(T* pObj, int2Type<true>)
{
T* pNewObj = pObj->Clone();
.....
}
void DoSomething(T* pObj, int2Type<false>)
{
T* pNewObj = new T(*pObj);
.....
}
public:
void DoSomething (T* pObj)
{
DoSomething(pObj, Int2Type<isPolymorphic> ( ) );
}
};
上面的小技巧之所以有效是因为:编译器并不会去编译一个未被使用到的template函数,只会对它进行文法检查。
二、型别对型别的映射
template <typename T>
struct Type2Type
{
typedef T Type;
};
template <class T, class U>
T* create(const U&arg, Type2Type<T>)
{
return new T(arg);
}
template <class U>
Widget* create(const U& arg, Type2Type<Widget>)
{
return new Widget(arg, -1);
}
String* pStr = create("hello", Type2Type<String> ( ) );
Widget* pW = create(100, Type2Type<Widget> ( ) );