Как вернуть нулевые указатели из методов CORBA?

Допустим, у меня есть простой кусок кода, подобный этому:

if(!hardware.produceMeSomeData())
  somehowHandleFailure();

Теперь я хочу, чтобы мой HW работал на отдельном компьютере, с которым я хочу общаться удаленно с 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 в этом случае, но это также не выглядит как хороший и стабильный дизайн.

Есть ли лучшее и более простое решение для этого?

0 ответов

Другие вопросы по тегам