Constructores de clases Cython y C ++.

¿Puede alguien sugerir una forma de manipular objetos c ++ con Cython, cuando se espera que la instancia c ++ de una clase alimente al constructor de otra clase envuelta como se describe a continuación?

Mire la nota en el archivo pyx para la clase PySession, que toma un objeto PyConfigParams de python como argumento y luego necesita extraer valores de él para construir un objeto ConfigParams de c ++. El objeto ConfigParams luego se usa para alimentar al constructor de Session.

Sería ideal tener un procedimiento que me permita "inyectar" el objeto ConfigParams c ++ envuelto por el objeto PyConfigParams directamente en el constructor de Session, sin tener que desmontarlo primero y luego construir un nuevo objeto c ++ para alimentar al constructor. Esto funciona, por supuesto. Sin embargo, es una forma incómoda y brutal de implementar esta solución, por no mencionar que no es confiable.

Soy consciente de PyCapsule, sin embargo puede requerir tocar los encabezados de c ++, que es algo que no puedo hacer.

Relacionado con esto, pero una pregunta diferente es: ¿qué sucede si necesito una clase envuelta (digamos aquí PySession) para simular el comportamiento de la API de C ++ al devolver una instancia de ConfigParams? ¿Tendría que hacer lo contrario y desmontar el objeto c ++ para crear un PyConfigParams de Python que luego se devolvería al usuario de Python en el mundo de Python? Cualquier sugerencia es muy bienvenida! ¡Gracias!

Supongamos que tengo dos clases de c ++ llamadas ConfigParams y Session. Se utiliza una instancia de ConfigParams para alimentar al constructor de la clase Session:

Clases de C ++Clase ConfigParams
<code>// ConfigParams.h
#include <iostream> 
using namespace std; 
class ConfigParams 
{ 
  int parameter1; 
 public: 
  ConfigParams(int par1) { this->parameter1 = par1;} 
  int getPar1() { return this->parameter1; } 
};
</code>
Clase de sesion
<code>// Session.h 
#include <iostream> 
using namespace std; 
#include "configparams.h" 
class Session 
{ 
  int sessionX; 
 public: 
  Session(ConfigParams parameters) { this->sessionX = parameters.getPar1(); } 
  void doSomething(); 
}; 

void Session::doSomething() 
{ 
  cout << "Session parameters set as: " << endl; 
  cout << "X = " << this->sessionX << endl; 
} 
</code>
Cython pyx y archivos pxd para las clases anteriores:PyConfigParams
<code># configparams.pxd 
cdef extern from "configparams.h": 
    cppclass ConfigParams: 
        ConfigParams(int par1) 
        int getPar1() 

# configparams.pyx 
cdef class PyConfigParams: 
    cdef ConfigParams* thisptr 
    def __cinit__(self, i): 
        self.thisptr = new ConfigParams(<int> i) 
    def getPar1(self): 
        return self.thisptr.getPar1() 
</code>
Clase PySession
<code># session.pxd 
from configparams cimport * 
cdef extern from "session.h": 
    cdef cppclass Session: 
        Session(ConfigParams parameters) 
        void doSomething() 

# session.pyx
cdef class PySession: 
    cdef Session* thisptr 
    def __cinit__(self, pars): 
        # Note that here I have to extract the values 
        # from the pars (python PyConfigParams object) 
        # in order to build a c++ ConfigParams object 
        # which feeds the c ++ constructor of Session. 
        cdef ConfigParams* cpppargsptr = new ConfigParams(<int> pars.getPar1()) 
        self.thisptr = new Session(cpppargsptr[0]) 
    def doSomething(self): 
        self.thisptr.doSomething() 
</code>

Respuestas a la pregunta(1)

Su respuesta a la pregunta