2012-10-23 8 views
8

Sto provando a convertire una funzione C++ con il riferimento std::string a C#.Come SWIG std: string & to C# ref stringa

mio API simile a questa:

void GetStringDemo(std::string& str); 

Idealmente mi piacerebbe vedere qualcosa di simile da C#

void GetStringDemoWrap(ref string); 

ho capito ho bisogno di creare un typemap per questo, e ho provato un poche cose giocando con il file std_string.i, ma non penso di arrivare da nessuna parte. Qualcuno ha qualche esempio. Sono nuovo sia per Swig che per C# quindi non sono in grado di inventare idee originali.

risposta

5

Nel caso in cui qualcuno lo stia cercando in futuro, ho creato std_string.i in questo modo per C#. Sembra funzionare per me. Nota che ho cambiato il ref in quanto era più appropriato nel mio caso, ma anche ref dovrebbe funzionare.

ho chiamato% include "std_string.i" dal file .i

/* ----------------------------------------------------------------------------- 
* 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; %} 

} 

La ragione per cui ho bisogno di definire Argout per std :: string const & è perché SWIG si confonderà e sovrascrivere std const: : stringa & anche con la typemap. Così ho esplicitamente dire che non ignorare nel mio caso (Potrebbe essere un caso d'uso diverso)

Per Python ho creato qualcosa di simile:

%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& 
%}