数字型别化
template<int v>
struct Int2Type
{
enum { value = v };
};
作用: 根据引数所得的不同数值来产生不同型别。
eg: Int2Type<1>与Int2Type<2>是不同的数据类型,通过它可以在编译期选择不同数据类型,即编译期的条件判断。
使用场景需满足以下两个条件:
1、有必要根据某个编译期常数调用一个或数个不同的函数。
2、有必要在编译期实施“分派”( dispatch) 。
例子
选择函数
template <typename T, bool isPo1ymorphic>
struct NiftyContainer
{
void DoSomething(T *pObj)
{
DoSomething(pObj, Int2Type<isPolymorphic>);
}
private :
void DoSomething(T* pObj, Int2Type<true>)
{
T* pNewObj = pObj->Clone();
...polymorphic algorithm ...
}
void DoSomething(T* pObj, Int2Type<false>)
{
T* pNewObj = new T(*pObj);
... nonpo1ymorphic algorithm ...
}
};
【注】这里采用的bool值进行分派,属于对称性分派。
编译期分派工作的底层逻辑
编译器并不会去编译一个未被用到的template函数,只会对它做文法检查。