神奇的sizeof

关于sizeof运算符的使用和注意事项,这篇http://hi.baidu.com/xung/blog/item/14267827c0f42c06918f9d04.html有比较好的说明,可以看下。

sizeof最主要的用途是计算大小,以避免代码中出现一些写死的机器相关的值。另外它还是一个很神奇的运算符,由于它并不会真正执行表达式而仅仅返回大小的特性,你可以做一些很棒的事。

看一个例子,它来自LOKI库:

Typelist要管理一堆Type,某些操作需要知道其中两个Type的继承关系,如何用代码做到?

简化一下,假定有两个类型A、B,我们只解决B是否继承自A(相反的问题可以用同样方法解决)

由于派生类的指针可以转型成基类指针,我们利用这点,先声明一个函数Test(只是声明)

Small Test( A* );

Big    Test( ... ); // 特殊语法接受任意类型

// Small/Big定义,大小不一样

class Small  { char dummy[1] };

class Big      { char dummy[2] };

对Test传B对象的指针,如果返回Small那就是继承,否则就不是继承;和sizeof一起使用

bool fInherit = sizeof( Test( new B ) ) == sizeof( Small );

由于sizeof并不真正执行Test函数,所以你不需要实现它;new B也没有真正执行,所以B的构造函数都可以不实现。

sizeof( Test( new B ) ) == sizeof( Small )在编译器就会被计算出来,为true或false,神奇吧!

但这里还有一个潜在问题,B的构造函数可能是私有的,如果那样就编译不过了,怎么办?

没事,再声明个函数

B*   GetB();

bool fInherit = sizeof( Test( GetB() ) ) == sizeof( Small );

同样不需要实现它,现在一切OK了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值