2012-10-23 9 views
8

Ich versuche, eine C++ Funktion mit std::string Verweis auf C# zu konvertieren.Wie SWIG Std :: String & C# Ref Zeichenfolge

Meine API sieht wie folgt aus:

void GetStringDemo(std::string& str); 

Im Idealfall würde Ich mag so etwas wie dies von C#

sehen
void GetStringDemoWrap(ref string); 

Ich verstehe, ich brauche eine typemap dafür zu schaffen, und ich versuchte, ein einige Dinge, indem Sie mit der Datei std_string.i herumspielen, aber ich glaube nicht, dass ich irgendwohin komme. Hat jemand ein Beispiel? Ich bin neu sowohl in Swig als auch in C#, daher kann ich mir keine echten Ideen einfallen lassen.

Antwort

5

Nur für den Fall, dass jemand in Zukunft nach diesem sucht, habe ich std_string.i so für C# erstellt. Scheint für mich zu arbeiten. Beachten Sie, dass ich den Verweis geändert habe, da es in meinem Fall passender war, aber ref sollte auch funktionieren.

I% genannt sind "std_string.i" aus der .i-Datei

/* ----------------------------------------------------------------------------- 
* std_string_ref.i 
* 
* Typemaps for std::string& and const std::string& 
* These are mapped to a C# String and are passed around by reference 
* 
* ----------------------------------------------------------------------------- */ 

%{ 
#include <string> 
%} 

namespace std { 

%naturalvar string; 

class string; 

// string & 

%typemap(ctype) std::string & "char**" 
%typemap(imtype) std::string & "/*imtype*/ out string" 
%typemap(cstype) std::string & "/*cstype*/ out string" 

//C++ 
%typemap(in, canthrow=1) std::string & 
%{ //typemap in 
    std::string temp; 
    $1 = &temp; 
%} 

//C++ 
%typemap(argout) std::string & 
%{ 
    //Typemap argout in c++ file. 
    //This will convert c++ string to c# string 
    *$input = SWIG_csharp_string_callback($1->c_str()); 
%} 

%typemap(argout) const std::string & 
%{ 
    //argout typemap for const std::string& 
%} 

%typemap(csin) std::string & "out $csinput" 

%typemap(throws, canthrow=1) string & 
%{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); 
    return $null; %} 

} 

Der Grund, warum ich brauche für const std definieren Argout :: string & ist, weil SWIG verwirrt wird und const std außer Kraft setzen: : string & auch mit der typecap. Also habe ich es ausdrücklich sagen, nicht in meinem Fall außer Kraft zu setzen (Sie einen anderen Anwendungsfall haben kann)

Für Python habe ich so etwas wie dieses:

%typemap(argout)std::string& 
{ 
    //typemap argout std::string& 
    PyObject* obj = PyUnicode_FromStringAndSize((*$1).c_str(),(*$1).length()); 

    $result=SWIG_Python_AppendOutput($result, obj); 
} 

%typemap(argout) const std::string & 
%{ 
    //argout typemap for const std::string& 
%} 
Verwandte Themen