En C ++ / CLI, comment déclarer et appeler une fonction avec un paramètre ‘out’?

J’ai une fonction qui parsing une chaîne en deux chaînes. En C # je le déclarerais comme ceci:

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

et je l’appellerais comme ceci:

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

Le projet en cours doit être fait en C ++ / CLI. J’ai essayé

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

mais si je l’appelle comme ça:

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

Je reçois une erreur de compilation et si je l’appelle comme ceci:

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

alors je reçois une erreur à l’exécution. Comment devrais-je déclarer et appeler ma fonction?

C ++ / CLI lui-même ne supporte pas un vrai argument ‘out’, mais vous pouvez marquer une référence comme un argument out pour que les autres langages le voient comme un argument réel.

Vous pouvez le faire pour les types de référence en tant que:

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

Et pour les types de valeur comme:

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

Le% en fait un paramètre ‘ref’ et les marques OutAtsortingbute sont utilisées uniquement pour les valeurs de sortie.

En utilisant Visual Studio 2008, cela fonctionne et a résolu un problème majeur dans mon travail. Merci!

 // header // Use namespace for Out-atsortingbute. using namespace System::Runtime::InteropServices; namespace VHT_QMCLInterface { public ref class Client { public: Client(); void ReturnInteger( int a, int b, [Out]int %c); void ReturnSsortingng( int a, int b, [Out]Ssortingng^ %c); } } // cpp namespace VHT_QMCLInterface { Client::Client() { } void Client::ReturnInteger( int a, int b, [Out]int %c) { c = a + b; } void Client::ReturnSsortingng( int a, int b, [Out]Ssortingng^ %c) { c = Ssortingng::Format( "{0}", a + b); } } // cs namespace TestQMCLInterface { class Program { VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client(); static void Main(ssortingng[] args) { Program l_Program = new Program(); l_Program.DoReturnInt(); l_Program.DoReturnSsortingng(); 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 DoReturnSsortingng() { int x = 10; int y = 20; Ssortingng z = "xxxx"; m_Client.ReturnSsortingng(x, y, out z); Console.WriteLine("\nReturnSsortingng: {0} + {1} = '{2}'", x, y, z); } } } 

Ce n’est pas supporté Le plus proche que vous pouvez obtenir est ref

Certes, vous pouvez faire semblant, mais vous perdez une vérification de la compilation.