Как проверить ссылку 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)
}
}
EDIT
Вышеизложенное является лишь упрощенным примером. На самом деле я работаю над библиотекой-оболочкой, которая "переводит" управляемый и машинный код. Класс, над которым я работаю, является собственным классом C++, который обертывает управляемый объект. В конструкторе собственного класса C++ I получите ссылкуgcroot
, которую я хочу проверить на null.3 ответа:
Используйте
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