In precedenza ho avuto problemi con il tentativo di applicare i tipamp di OUTPUT di SWIG ai tipi di classe e ho chiesto questo previous question.Come creare un typemap OUTPUT per un tipo di classe?
Le risposte che ho ricevuto ci sono stati utili, ma ancora mi richiedono di chiedere SWIG per fare qualcosa di simile:
%apply exportedClassType& OUTPUT { exportedClassType& result };
Questo non sembra funzionare per me su SWIG 3.0.6, con il seguente messaggio :
Warning 453: Can't apply (exportedClassType &OUTPUT). No typemaps are defined.
guardando the documentation:
Essere consapevoli del fatto che il Primar Lo scopo del file typemaps.i è di supportare i tipi di dati primitivi. Scrivere una funzione come questa void foo(Bar *OUTPUT);
potrebbe non avere l'effetto desiderato poiché typemaps.i non definisce una regola OUTPUT per Bar.
Non sembra che questo sia supportato. Quindi credo che la mia domanda è, quale combinazione di typemaps ho bisogno di definire nel file interface.i in modo che il codice wrapper generato per tipi di classe va da questo:
// interface.i
%apply exportedClassType& OUTPUT { exportedClassType& result };
int getClassType(exportedClassType& result);
// interface_wrap.cxx
SWIGINTERN PyObject *_wrap_getClassType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
exportedClassType *arg1 = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
int result;
if (!PyArg_ParseTuple(args,(char *)"O:getClassType",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_exportedClassType, 0);
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getClassType" "', argument " "1"" of type '" "exportedClassType &""'");
}
if (!argp1) {
SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "getClassType" "', argument " "1"" of type '" "exportedClassType &""'");
}
arg1 = reinterpret_cast< exportedClassType * >(argp1);
result = (int)getClassType(*arg1);
resultobj = SWIG_From_int(static_cast<int>(result));
return resultobj;
fail:
return NULL;
}
// wrapper.py
def getClassType(result):
return _wrapper.getClassType(result)
getClassType = _wrapper.getClassType
a qualcosa di più simile a questo?
// interface.i
%apply bool& OUTPUT { bool& result };
int getSimpleType(bool& result);
// interface_wrap.cxx
SWIGINTERN PyObject *_wrap_getSimpleType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
bool *arg1 = 0 ;
bool temp1 ;
int res1 = SWIG_TMPOBJ ;
int result;
arg1 = &temp1;
if (!PyArg_ParseTuple(args,(char *)":getSimpleType")) SWIG_fail;
result = (int)getSimpleType(*arg1);
resultobj = SWIG_From_int(static_cast<int>(result));
if (SWIG_IsTmpObj(res1)) {
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_bool((*arg1)));
} else {
int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0) : 0 ;
resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_bool, new_flags));
}
return resultobj;
fail:
return NULL;
}
// wrapper.py
def getSimpleType():
return _wrapper.getSimpleType()
getSimpleType = _wrapper.getSimpleType
non ottengo quello IN/OUT/typemaps Argout sono necessari in modo che SWIG_Python_AppendOutput
ecc è chiamato per il mio exportedClassType
. Qualcuno può darmi qualche suggerimento? Nessun gioco di parole previsto.
Potrebbe fornire il prototipo dei metodi che si desidera esportare. Solitamente avvolgo i costruttori e consento a SWIG di gestire il polimorfismo, ma sono riuscito a creare una fabbrica, in cui l'output è di riferimento. –
Possibile duplicato di [Come applicare i typemaps di SWIG OUTPUT per i tipi di classe in Python?] (Http://stackoverflow.com/questions/32478649/how-to-apply-swig-output-typemaps-for-class-types-in -pitone) –