In C++/CLI, how do I declare and call a function with an 'out' parameter?

Viewed 47506

I have a function which parses one string into two strings. In C# I would declare it like this:

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

and I'd call it like this:

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

The current project has to be done in C++/CLI. I've tried

using System::Runtime::InteropServices;

...

void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort)
{
    ...
}

but if I call it like this:

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

I get a compiler error, and if I call it like this:

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

then I get an error at runtime. How should I declare and call my function?

3 Answers

C++/CLI itself doesn't support a real 'out' argument, but you can mark a reference as an out argument to make other languages see it as a real out argument.

You can do this for reference types as:

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

// Called as
String^ result;
ReturnString(result);

And for value types as:

void ReturnInt([Out] int% value)
{
   value = 32;
}

// Called as
int result;
ReturnInt(result);

The % makes it a 'ref' parameter and the OutAttribute marks that it is only used for output values.

It's not supported. The closest you can get is ref

Granted you can fake it, but you lose a compile time check.

Related