C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

C++模版使用技巧--Int2Type


一  Int2Type
平常我们所看到的int是一个类型,例如1,2,3...等属于int。 但是这里说的是通过模版使每一个int类型变量都当成是不同的类型。
二 C++模版的迟绑定
这个名字是我起的,因为不知道正式的称呼是什么,意思是说在使用C++的模版的时候,只有在你的代码里面调用了某个模版方法,在编译的时候才会产生对应的方法,也即编译后的代码中不包含我们没有使用的模版方法。看下面的实例是可以编译运行的:
class X {
public:
  
void f() {}
}
;

class Y {
public:
  
void g() {}
}
;

template 
<typename T> class Z {
  T t;
public:
  
void a() { t.f(); }
  
void b() { t.g(); }
}
;

int main() {
  Z
<X> zx;
  zx.a(); 
// Doesn't create Z<X>::b()
  Z<Y> zy;
  zy.b(); 
// Doesn't create Z<Y>::a()
}
 ///:~

三 问题

template <typename T, bool isPolymorphic>
class NiftyContainer
{   
   
void DoSomething()
   
{
      T
* pSomeObj = ;
      
if (isPolymorphic)
      
{
         T
* pNewObj = pSomeObj->Clone();
 
      }

      
else
      
{
         T
* pNewObj = new T(*pSomeObj);
         
      }

   }

}
;
class Test
{
public:
    Test()
{};
}
;

void main()
{
    NiftyContainer
<Test,true> test;
    
//test.DoSomething(); // 这里通不过编译
    
}
大家也许会说上面的方法代码没有问题,我说,有问题,仔细看一开始的代码和我的说明,我说的是只要我们的代码里面用到模版方法就会被编译为目标代码,而不是说在代码运行的时候使用到的代码才会被编译为目标代码,好的,搞清楚了这个就可以知道上面的实例为什么通不过编译了。
四 Int2Type
下面正式进入主题Int2Type的作用和使用,上面的实例,我们传入的T类型中只有clone或public构造函数中的一个,我们想根据bool值来选择使用clone或new,但是上面的代码有问题,编译都不过偶,下面使用Int2Type来实现:

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>());
   }

}
;
class Test
{
public:
    Test()
{};
}
;
void main()
{
    NiftyContainer
<Test,false> test; //如果用ture不会通过编译
    Test* t = new Test();
    test.DoSomething(t);
}

看了上面的代码,我不禁要再次的赞叹《C++设计新思维》的作者,高!

posted on 2007-05-24 20:01 梦在天涯 阅读(2494) 评论(1)  编辑 收藏 引用 所属分类: CPlusPlus

评论

# re: C++模版使用技巧--Int2Type 2007-05-24 20:06 梦在天涯

想看更强的Type2Type,请参看《C++设计新思维》  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1745002
  • 排名 - 5

最新评论

阅读排行榜