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};
};
//这是我的实现,书中的更通用。