2014-01-20 10 views
15

In einem C++/CLI-Projekt habe ich eine Methode in einer nativen C++ - Klasse, wo ich eine gcroot Referenz für NULL oder nullptr überprüfen möchte. Wie mache ich das? Keiner der folgenden scheint zu funktionieren:Wie gcroot Referenz für NULL oder nullptr zu testen?

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

Die oben ist nur ein vereinfachtes Beispiel. Ich arbeite tatsächlich an einer Wrapper-Bibliothek, die zwischen verwaltetem und nativem Code "übersetzt". Die Klasse, an der ich arbeite, ist eine native C++ - Klasse, die ein verwaltetes Objekt umschließt. Im Konstruktor der nativen C++ - Klasse bekomme ich eine gcroot Referenz, die ich auf Null überprüfen möchte.

Antwort

22

Verwenden Sie eine static_cast, um die gcroot in den verwalteten Typ zu konvertieren, und vergleichen Sie das dann mit nullptr.

Mein Testprogramm:

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; 
} 

Ergebnisse:

 
aString == nullptr 
aString != nullptr 
12

Dies funktioniert auch:

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

Hier ist ein weiterer Trick, kann sogar noch lesbar sein:

void PrintString(gcroot <System::String^> str) 
{ 
    if (str.operator ->() != nullptr) 
    { 
     Console::WriteLine("The string is: " + str); 
    } 
} 
Verwandte Themen