假设我有一段简单的代码:
if(!hardware.produceMeSomeData())
somehowHandleFailure();
现在我想让我的硬件运行在一台单独的计算机上,我想用CORBA远程通信。因此,两侧的CORBA层看起来与此类似:
HardwareData* HardwareClient::produceMeSomeData()
{
IDL::HardwareData_var hwDataIdl;
_hardwareRef->produceMeSomeData(hwDataIdl.out());
HardwareData* hwData = nullptr;
// here I'd like to do sth like this:
if(!CORBA::is_nil(hwDataIdl))
HardwareDataFromIdl(hwDataIdl.in(), hwData);
return hwData;
}
HardwareServant::produceMeSomeData(IDL::HardwareData_out hwDataOut)
{
HardwareData* hwData = _hardware->produceMeSomeData();
if(hwData)
HardwareDataToIdl(hwData, hwDataOut.ptr());
else
// ???
}
问题是,CORBA似乎不允许以任何方式返回nullpointers。如果我直接将nullptr分配给_out类型,则调用将抛出一个BAD_PARAM异常,如文档中所述,如果我没有为其分配任何内容,则相同。 所以它基本上迫使我创建一个对象,因此我很难设计出我需要的逻辑。具体而言,我必须滥用有效的对象来表示nullpointer,这样我才能在客户端区分这两个结果。 我的另一个想法是将返回类型包装到一个带有布尔值的结构中,该布尔值告诉我该对象是否有效。
我现在正在使用的快速黑客只是在客户端捕获BAD_PARAM异常并在这种情况下返回nullptr,但这看起来不像是好的和稳定的设计。
对此有更好更简单的解决方案吗?