假设我有一段简单的代码,如下所示:
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 似乎不允许以任何方式返回空指针。如果我直接将 nullptr 分配给 _out 类型,则该调用将引发 BAD_PARAM 异常,如文档中所述,如果我不为其分配任何内容,则相同。所以它基本上迫使我创建一个对象,因此很难设计我需要的逻辑。具体来说,我不得不滥用一个有效的对象来表示一个空指针,这样我就可以在客户端区分这两个结果。我的另一个想法是将返回类型包装到一个带有布尔值的结构中,它告诉我对象是否有效。
我现在使用的快速破解只是在客户端捕获 BAD_PARAM 异常并在这种情况下返回 nullptr ,但这看起来也不是好的和稳定的设计。
有没有更好更简单的解决方案?