Подтвердить что ты не робот

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

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

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

и я бы назвал это следующим образом:

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

Текущий проект должен быть выполнен в С++/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);

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

4b9b3361

Ответ 1

Сам С++/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 указывает, что он используется только для выходных значений.

Ответ 2

Используя 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);
        }
     }
}

Ответ 3

Не поддерживается. Самое близкое, что вы можете получить, это ref

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