1

假设我有一段简单的代码,如下所示:

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 ,但这看起来也不是好的和稳定的设计。

有没有更好更简单的解决方案?

4

0 回答 0