Как проверить ссылку на gcroot на NULL или nullptr?

В проекте C ++ / CLI у меня есть метод в нативном классе C ++, где я хотел бы проверить gcroot ссылка для NULL или же nullptr, Как мне это сделать? Ничто из следующего не работает:

void Foo::doIt(gcroot<System::String^> aString)
{
// This seems straightforward, but does not work
if (aString == nullptr)
{
// compiler error C2088: '==': illegal for struct
}

// Worth a try, but does not work either
if (aString == NULL)
{
// compiler error C2678: binary '==' : no operator found
// which takes a left-hand operand of type 'gcroot<T>'
// (or there is no acceptable conversion)
}// Desperate, but same result as above
if (aString == gcroot<System::String^>(nullptr))
{
// compiler error C2678: binary '==' : no operator found
// which takes a left-hand operand of type 'gcroot<T>'
// (or there is no acceptable conversion)
}
}

РЕДАКТИРОВАТЬ

Выше приведен лишь упрощенный пример. На самом деле я работаю над библиотекой-оболочкой, которая «переводит» между управляемым и нативным кодом. Класс, над которым я работаю, является собственным классом C ++, который оборачивает управляемый объект. В конструкторе нативного класса C ++ я получаю gcroot ссылка, которую я хочу проверить на ноль.

16

Решение

Использовать static_cast преобразовать gcroot к управляемому типу, а затем сравните это с nullptr,

Моя тестовая программа:

int main(array<System::String ^> ^args)
{
gcroot<System::String^> aString;

if (static_cast<String^>(aString) == nullptr)
{
Debug::WriteLine("aString == nullptr");
}

aString = "foo";

if (static_cast<String^>(aString) != nullptr)
{
Debug::WriteLine("aString != nullptr");
}

return 0;
}

Результаты:

aString == nullptr
aString! = nullptr
25

Другие решения

Это также работает:

void Foo::doIt(gcroot<System::String^> aString)
{
if (System::Object::ReferenceEquals(aString, nullptr))
{
System::Diagnostics::Debug::WriteLine("aString == nullptr");
}
}
12

Вот еще один трюк, который может быть даже более читабельным:

void PrintString(gcroot <System::String^> str)
{
if (str.operator ->() != nullptr)
{
Console::WriteLine("The string is: " + str);
}
}
4
По вопросам рекламы [email protected]