强大sizeof

sizeof 对于学过 c的来说很熟悉了。
   c中经常这样用:
   sizeof(int);
   sizeof(struct MyS);
   char str[]="goodbye!";
   sizeof(str);
   sizeof("string ");
   ...

 sizeof在C++中发生一个变化 就是可以对 函数进行求解。
   int f(void);
   sizeof(f);
 sizeof实质就是通过求解类型,最后获得内存大小的 编译时函数。

   sizeof(8);//其实就是 sizeof(int)最后就是 int的内存大小(以char为基准)
  
   那个sizeof(f);也是通过确定f的原型来确定返回值,再来求解内存大小。

   求解类型对于 对象就是它的声明类型,对于函数就是它原型的返回值类型。

   在C++中因为函数可以重载,所以在求解函数原型是会引起函数重载解析过程。
  
   函数重载会引发一系列的微妙的操作。比如 template类的实例话,到public基类指针(或引用)的装换。
  
再加上替换失败不是错误的配合,sizeof可以用在很多有用的情景。
  
   模板研读 一书的 判断 Class 类型的 模板:
template<typename T>
class IsClass
{
private:
    typedef char One;
    typedef struct{ char l[2];} Two ;
    template<typename U>
    static Two test(...);
    template<typename U>
    static One test(int (U::*));
public:   
    enum{Yes=sizeof(test<T>(0))==1};
    enum{No=!Yes};        
};
 
  sizeof不会去决议表达式,它只是利用表达式去求解,得到答案后会丢弃表达式。
  所以上面的test只要声明就可以了。

  Modern C++ Design中也讲到个:
  判断继承关系。
  template<typename U,typename T>
  class SuperSubClass
  {
  private:
    typedef char One;
    typedef struct{ char l[2];} Two ;
    template<typename C>
    static Two test(...);
    template<typename C>
    static One test(C*);
  public:   
    enum{Yes=sizeof(test<U>((T*)0))==1};
    enum{No=!Yes};  
  };
  //这是我的实现,书中的更通用。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页