2.4 常整数映射为型别
以下模板:
1 template < int v >
2 struct Int2Type{
3 enum { value = v };
4 }
Int2Type会根据引数所得的不同数值来产生不同型别。Int2Type<0> 和 Int2Type<1>是两种不同的类型。采用Int2Type可根据编译期计算出来的结果选用不同的函数。实际上你可以运用一个常数达到静态分派功能。
一般而言,符合下列两个条件可使用Int2Type:
a.有必要根据某个编译期常数调用一个或数个不同的函数。
b.有必要在编译期实施“分派”。
运行时分派可以使用if...else...或switch。但有时难以做到。举例如下:
假设一个容器NiftyContainer,
1 template <class T> class NiftyContainer{};
其内含指针,指向 T 的对象。为了复制容器中某个对象,你想调用copy构造函数(非多态)或虚函数Clone()(多态)。但你无法这样做:
1 template < typename T, bool isPolymorphic>
2 class NiftyContainer{
3 void DoSomething(){
4 T* pSomeObj = ;
5 if (isPolymorphic){
6 T* pNewObj = pSomeObje->Clone();
7 //
8 }else{
9 T* pNewObj = new T(*pSomeObj);
10 //
11 }
12 };
你会发现编译不过,编译器会发现未定义的函数。而Int2Type提供了一个办法:
1 template <typename T, bool isPolymrphoic>
2 class NiftyContainer{
3 private:
4 void DoSomething(T* pObj, Int2Type<true>){
5 T* pNewObj = pSomeObje->Clone();
6 //
7 }
8 void DoSomething(T* pObj, Int2Type<false>){
9 T* pNewObj = new T(*pSomeObj);
10 //
11 }
12 public:
13 void DoSomething(T* pObj){
14 DoSomething(pObj, Int2Type<isPolymorphoic>());
15 }
16 };
主要原因是编译器不会去编译一个未被用到的template函数。