В C ++ / CLI, как я объявляю и вызываю функцию с параметром ‘out’?

У меня есть функция, которая анализирует одну строку на две строки. В C # я бы объявил это следующим образом:

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

и я бы назвал это так:

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

Текущий проект должен быть выполнен в C ++ / CLI. я пробовал

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

но если я назову это так:

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

Я получаю ошибку компилятора, и если я так называю это:

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

то во время выполнения я получаю сообщение об ошибке. Как я могу объявить и вызывать свою функцию?

Сам C ++ / CLI не поддерживает реальный аргумент «out», но вы можете пометить ссылку как аргумент out, чтобы другие языки рассматривали его как реальный аргумент.

Вы можете сделать это для ссылочных типов как:

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

А для типов значений:

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

Значение% делает его параметром ‘ref’, а знак OutAttribute указывает, что он используется только для выходных значений.

Используя Visual Studio 2008, это работает и решает основную проблему на моей работе. Благодаря!

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

Это не поддерживается. Ближайшим, который вы можете получить, является ref

Конечно, вы можете подделать его, но вы потеряете проверку времени компиляции.

  • Каково использование «ref» для ссылочных типов переменных в C #?
  • Передача целочисленного значения по ссылке в Python
  • Как передать объекты в функции на C ++?
  • Список, пройденный ref - помогите мне объяснить это поведение
  • Передать по ссылке / значению в C ++
  • Является ли Java «pass-by-reference» или «pass-by-value»?
  • Что такое семантика copy-on-modify в R, а где канонический источник?
  • Передача свойств по ссылке в C #
  • Передача строки по ссылке в Java?
  • C ++ - передача ссылок на std :: shared_ptr или boost :: shared_ptr
  • Java НИКОГДА не пропускает ссылку, правильно? ... правильно?
  • Interesting Posts
    Давайте будем гением компьютера.