In C ++ / CLI, come posso dichiarare e chiamare una funzione con un parametro ‘out’?

Ho una funzione che analizza una stringa in due stringhe. In C # lo dichiarerei così:

void ParseQuery(string toParse, out string search, out string sort) { ... } 

e lo chiamerei in questo modo:

 string searchOutput, sortOutput; ParseQuery(userInput, out searchOutput, out sortOutput); 

Il progetto corrente deve essere fatto in C ++ / CLI. ho provato

 using System::Runtime::InteropServices; ... void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort) { ... } 

ma se lo chiamo così:

 String ^ searchOutput, ^ sortOutput; ParseQuery(userInput, [Out] searchOutput, [Out] sortOutput); 

Ottengo un errore del compilatore e se lo chiamo in questo modo:

     String ^ searchOutput, ^ sortOutput; ParseQuery(userInput, searchOutput, sortOutput); 

    poi ricevo un errore in fase di esecuzione. Come dovrei dichiarare e chiamare la mia funzione?

    C ++ / CLI in sé non supporta un vero argomento ‘out’, ma puoi contrassegnare un riferimento come un argomento out per far sì che altri linguaggi lo vedano come un argomento reale.

    Puoi farlo per tipi di riferimento come:

     void ReturnString([Out] String^% value) { value = "Returned via out parameter"; } // Called as String^ result; ReturnString(result); 

    E per i tipi di valore come:

     void ReturnInt([Out] int% value) { value = 32; } // Called as int result; ReturnInt(result); 

    Il% lo rende un parametro ‘ref’ e OutAttribute contrassegna che è usato solo per i valori di output.

    Utilizzando Visual Studio 2008, questo funziona e ha risolto un grosso problema nel mio lavoro. Grazie!

     // header // Use namespace for Out-attribute. using namespace System::Runtime::InteropServices; namespace VHT_QMCLInterface { public ref class Client { public: Client(); void ReturnInteger( int a, int b, [Out]int %c); void ReturnString( int a, int b, [Out]String^ %c); } } // cpp namespace VHT_QMCLInterface { Client::Client() { } void Client::ReturnInteger( int a, int b, [Out]int %c) { c = a + b; } void Client::ReturnString( int a, int b, [Out]String^ %c) { c = String::Format( "{0}", a + b); } } // cs namespace TestQMCLInterface { class Program { VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client(); static void Main(string[] args) { Program l_Program = new Program(); l_Program.DoReturnInt(); l_Program.DoReturnString(); Console.ReadKey(); } void DoReturnInt() { int x = 10; int y = 20; int z = 0; m_Client.ReturnInteger( x, y, out z); Console.WriteLine("\nReturnInteger: {0} + {1} = {2}", x, y, z); } void DoReturnString() { int x = 10; int y = 20; String z = "xxxx"; m_Client.ReturnString(x, y, out z); Console.WriteLine("\nReturnString: {0} + {1} = '{2}'", x, y, z); } } } 

    Non è supportato Il più vicino è ansible rif

    Certo, puoi fingere, ma perdi un controllo del tempo di compilazione.