19.8.2 interface_cast_noaddref
正如我们示例代码中展示的那样,有时候你只不过是想在某个接口上进行一次函数调用。这种情况下,大动干戈地写上8行代码似乎显得有点过于笨重了。因此,第二个接口强制,即interface_cast_noaddref应运而生。借助于该强制,刚才的示例可以瘦身为3行代码:
- IImpC *ic = . . .;
- BOOL bOO;
- interface_cast_noaddref<IImpCpp*>(ic)->CanSupportOO(&bOO);
正如它的名字所暗示的那样,interface_cast_noaddref并不会在给定的接口上发起AddRef()调用。不过确切一点说,它其实在内部调用了QueryInterface()来获取IImpCpp接口,从而递增了COM对象的引用计数,只不过这种递增只是暂时的,在使用它的那行语句的结束点上,它还会自动释放先前获取的接口,这就意味着引用计数的递减。所以,从整体上来说使用interface_cast_noaddref就像其名字暗示的那样,对它所作用的COM对象上的引用计数没有任何影响。
由于该强制在单行语句中执行接口查询以及其上的方法调用,这么一来客户代码中就没有机会进行错误测试了,因此该强制选择当获取指定接口失败时抛出异常,缺省情况下抛出的异常是bad_interface_cast。