En C++/CLI, comment dois-je déclarer et appeler une fonction avec un paramètre?

j'ai une fonction qui divise une corde en deux cordes. En C#, je voudrais déclarer comme ceci:

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

et je voudrais l'appeler comme ceci:

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

le projet actuel doit être fait en C++/CLI. J'ai essayé

using System::Runtime::InteropServices;

...

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

mais si je l'appelle comme ceci:

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

j'obtiens une erreur du compilateur, et si je l'appelle comme ceci:

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

ensuite j'ai une erreur à l'exécution. Comment dois-je déclarer et appeler ma fonction?

46
demandé sur Ben Voigt 2008-10-09 13:06:34

3 réponses

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

Vous pouvez faire cela pour les types de référence:

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

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

et pour les types de valeurs comme:

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

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

le % en fait un paramètre ' ref ' et les notes OutAttribute qu'il n'est utilisé que pour les valeurs de sortie.

74
répondu Bert Huijben 2014-05-13 08:59:27

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

// 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);
        }
     }
}
8
répondu Alexander Pacha 2014-04-29 10:58:25

il n'est pas supporté. Le plus proche que vous pouvez obtenir est ref

Certes, vous pouvez le simuler, mais vous perdez un contrôle de temps de compilation.

0
répondu Greg Dean 2008-10-14 12:57:45