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