编译期对可转换型和继承性的侦测

 

《C++设计新思维》说:如果要在编译期确定两种类型是否可以转换,比如type1是否可以转换到type2?然后以该结果做些很神奇的事情,应该怎么做?

 

可以借助超神奇的sizeof来完成任务。类型转换,如static_cast等,在很大程度上应该也是使用的sizeof吧……

这里所要做的只是进行判断,而不需要真正的进行转换。

(要注意的是:所谓可以转换,是指:大类型→小类型,如doule→int(可能丢失数据))

 

 

先说说对Big的定义,真是神来之笔……开始我还想,如果Small定义为char,怎么保证所定义的Big一定就大于Small?毕竟C++并没有强行规定类型的大小……

 

Test()函数,对typename是type2进行了特化;否则进行一般处理(实际上这里只是空函数,我们并不会调用这些函数,对之所需,只是其size,或返回值的size)。

MakeType1是传说中的稻草人函数。该函数并不会执行,其目的也并不是真正用来产生一个匿名对象。实际上,我们也并没有用它来产生匿名对象。别忘了我们这里是编译期,所有的事情都是在编译期进行完毕的,并不涉及到运行期。在运行期这些东东依然存在,但不起作用。稻草人函数MakeType1的作用只是来提示编译期,我们要以什么类型进行Test()的调用,编译期此时所关心的只是该Test()究竟是哪一个,以及其返回值是什么类型?以此来完成sizeof的运算,这就是这里编译器所要进行的全部。编译期并不会具现化什么东西,并不会去调用什么东西,因为这里是编译期……

MakeType1之所以存在是因为可能有些类将构造函数写成了private,那么这里就会失败。sizeof( Test( MakeType1() )完成的是:查找Test()调用的参数值,定位到正确Test(),计算其返回值的大小。完。

 

对exists2Way的求解,是在模板中嵌套使用了模板。

但是否这里会发生递归嵌套呢?应该exists2Way嵌套进去后依然会求解所嵌套的exists2Way……

记得在哪里看到过,不会发生递归嵌套……

 

/* partial specialization */ 后是对该模板的偏特化。如果两个类型都相同,很显然没必要再让编译期去sizeof了。

 

利用上述神技,可以很方便的进行是否继承关系的判断:

如果二者存在继承关系,则,sub class可以转换为base class,且,base class 不是void*

为何加const,这也大有文章。这是为了保证我们的代码不会改变原class。如果原class本是const,则编译期会自然的过滤掉一个const。

 

 

另要说明的是:当sizeof作用于函数时候,返回值是该函数的返回值的大小。

如:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值