那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

Modern C++ Design(MCD)学习笔记 && 测试代码(二)

/* *******************************************************************
    created:    2007/02/04
    filename:     CanConverse.cpp
    author:        Lichuang
                
                VC7,GCC下均可以编译通过
********************************************************************
*/

#include 
< iostream >

using   namespace  std;

template 
< class  T,  class  U >
class  Conversion
{
private :
    
//  sizeof(char) == 1,这是标准规定的
    typedef  char  Small;
    
//  sizeof(Big) == 2 * sizeof(char) > sizeof(char)
     class  Big     char  dummy[ 2 ]; } ;
    
//  Test型别是U,返回值是Small
     static  Small Test(U);
    
//  Test型别是任意型别,返回值是Big
     static  Big Test();
    
//  返回一个T型别的值
     static  T MakeT();

public :

    
//  exists的值反映了T是否可以转换为U
    
//  MakeT首先返回一个T型别的值, 传入Test()中
    
//  如果编译器确定T可以转换为U,那么调用返回Small的Test函数
    
//  否则调用返回Big的Test函数,则sizeof(Big) != sizeof(Small)
    
//  对于一般的型别如int, char,double,float而言只是进行隐性的转换
    
//  但是对于传入类指针的情况而言,那么派生类的指针可以转换为基类的指针
    
//  也正是基于这一点可以作为检查两个类是否有继承关系的技巧
     enum  
    
{
        exists 
=   sizeof (Test(MakeT()))  ==   sizeof (Small)
    }
;

    
//  型别T,U是否可以双向转换
     enum
    
{
        exists2Way 
=  exists  &&  Conversion < U, T > ::exists
    }
;

    
//  是否是同一个型别
     enum
    
{
        sameType 
=   false
    }
;
}
;

//  针对同一个型别的模版偏特化类
template  < class  T >
class  Conversion < T, T >
{
public :
    
enum
    
{
        exists 
=   1 ,
        exists2Way 
=   1 ,
        sameType 
=   1
    }
;
}
;

//  检查U是否是T的派生类的宏
//  第一条语句检查是否存在U*向T*的转换,如果存在上述关系那么派生类指针U*可以转换为基类指针T*
//  第二条检测派生类指针是不是和void*是一个型别的
#define  SUPERSUBCLASS(T, U)    \
    (Conversion
< const  U * const  T *> ::exists  &&     \
    
! Conversion < const  T * const   void *> ::sameType)

class  Base
{
}
;

class  Derive
    : 
public  Base
{
}
;

class  Test
{
}
;

int  main()
{
    cout 
<<  Conversion < double int > ::exists  <<   '   '   <<  endl;

    
if  (SUPERSUBCLASS(Base, Derive))
    
{
        cout 
<<   " can derive\n " ;
    }

    
if  ( ! SUPERSUBCLASS(Base, Test))
    
{
        cout 
<<   " Can not derive\n " ;
    }


    
return   0 ;
}


说明的注释都在sample代码里面了,我想无需做太多的解释,直接看代码就好了。

posted on 2007-02-04 23:18 那谁 阅读(1788) 评论(5)  编辑 收藏 引用 所属分类: C\C++

评论

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(二)  回复  更多评论   

加油,我以看完了。不好搞明白的东西。多写代码,即使是把它的代码一个一个
的重复的写一边和编译一边也是非常有意的。

推荐看看 c++ template 中文版(要是能看懂英文当然更是号)。这本书对模板技术的表达的还是非常全面的。

boost中的MPL库是用来完成编译器编程的,非常的不错,有空可以研究一下那个里面的代码。boost的基础就是模板。

stl并不是单纯的用了模板技术,而是用那个技术实现了范型,个人觉得用模板技术和范型思想,完全是对传统的面向对象技术的颠覆。非常的时尚
2007-02-04 23:49 | walkspeed

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(二)  回复  更多评论   

简单来说,boost的MPL有很多实际上是用来解决编译期的运算能力的限制问题。也就是说,tips和tricks影响了boost.MPL的可理解性。而且boost.MPL本身就是为了辅助模版程序的开发而存在的,所以如果没什么必要,可以不深究。loki和stl相对简单,对模版能力运用的侧重点上又有所不同,可以好好的看看。(个人以为,模版不全是为了泛型,元编程才是模版的真正意义所在。至于泛型,只是说在C++上用模版来实现的而已。)

在C++0x提供了Concept以后,boost的MPL应该会简化很多的。

还有就是模版不是拿来颠覆面向对象的。它和面向对象基本上没有什么交叉和冲突,应该算得是一个很有力的补充。
2007-02-05 14:00 | 空明流转

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(二)[未登录]  回复  更多评论   

看来回贴的兄弟研究过boost众的mpl了。对范型很有些了解也。

我对范型中的concept概念十分的感兴趣。这个东西对解耦十分棒,而且对设计思维的扩展真是不错。
2007-02-05 21:18 | walkspeed

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(二)  回复  更多评论   

喜欢这个blog, 加油
2007-02-05 22:16 | xbluewing

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(二)  回复  更多评论   

个人认为,boost.MPL是专门for Metaprogramming的,MPL=MetaProgramming Library嘛,而不是为了Template开发的。C++的Metaprogramming一定要用Template实现,但Template不一定就要用于Metaprogramming,如STL就不能算Metaprogramming,至少其中大部分不能算。
《Modern C++ Design》是一本好书,楼主看完后,如果对Metaprogramming感兴趣的话,可以再去看《C++ Template Metaprogramming》,肯定会大开眼界。只是Metaprogramming对于大多数程序员来说,并不是必修课,看你自己的兴趣了。
2007-02-10 10:13 | alai04

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