CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

《C++设计新思维》读书笔记(九)


 
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函数。
 

posted on 2007-12-17 22:15 cuigang 阅读(260) 评论(0)  编辑 收藏 引用 所属分类: 《C++设计新思维》读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理