C ++ / CLIで、「out」パラメーターを使用して関数を宣言して呼び出すにはどうすればよいですか?
-
06-07-2019 - |
質問
1つの文字列を2つの文字列に解析する関数があります。 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自体は実際の「出力」引数をサポートしていませんが、参照を出力引数としてマークして、他の言語に実際の出力引数として参照させることができます。
次のような参照タイプに対してこれを行うことができます。
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
ですあなたはそれを偽造することはできますが、コンパイル時のチェックを失います。
所属していません StackOverflow