19.8.1 interface_cast_addref
现在我们就来看一看其中之一,把刚才的例子重写如下:
- IImpC *ic = . . .;
- IImpCpp *icpp = interface_cast_addref<IImpCpp*>(ic);
- if(NULL != icpp)
- {
- BOOL bOO;
- icpp->CanSupportOO(&bOO);
- icpp->Release(); // 释放接口
- }
由于接口标识和指向接口的指针都是与请求的接口的类型相关的,所以我们可以从接口类型中将它们推导出来。这样一来我们就可以把对QueryInterface()的调用以及跟它相关的那些繁琐而冗长的代码藏起来,这么一来前面描述的两个问题就不复存在了。接口强制如果成功的话就会返回一个非空指针,客户端代码持有该指针,如果不再需要使用该接口,就通过它来释放该接口。
这是一个好的开端,但余下来的代码仍然毫无改观,包括检查转换是否成功,以及当我们不再需要该接口的时候必须手工释放接口。