Construtores de classe Cython e c ++
Alguém pode sugerir uma maneira de manipular objetos c ++ com Cython, quando a instância c ++ de uma classe é esperada para alimentar o construtor de outra classe empacotada como descrito abaixo?
Por favor, olhe a nota no arquivo pyx para a classe PySession, que pega um objeto PyConfigParams python como argumento e então precisa extrair valores dele para construir um objeto ConfigParams c ++. o objeto ConfigParams é então usado para alimentar o construtor de Session.
Seria ideal ter um procedimento que me permitisse "injetar" o objeto c ++ ConfigParams envolvido pelo objeto PyConfigParams diretamente no construtor de Session, sem ter que desmontá-lo primeiro e depois construir um novo objeto c ++ para alimentar o construtor. Isso funciona, claro. No entanto, é uma maneira complicada e brutal de implementar essa solução, sem mencionar que não é confiável.
Estou ciente do PyCapsule, no entanto, pode ser necessário tocar nos cabeçalhos c ++, o que é algo que não posso fazer.
Relacionado a isso, mas uma questão diferente é: e se eu precisar de uma classe envolvida (digamos, aqui PySession) para simular o comportamento da API C ++ retornando uma instância ConfigParams? Eu precisaria fazer o inverso e desmontar o objeto c ++ para construir um PyConfigParams Python que seria então retornado ao usuário Python no mundo Python? Todas as sugestões são bem-vindas! Obrigado!
Vamos supor que eu tenha duas classes c ++ chamadas ConfigParams e Session. Uma instância de ConfigParams é usada para alimentar o construtor da classe Session:
Classes C ++Classe 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>Classe de sessão
<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>Arquivos pyx e pxd do Cython para as classes acima: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>Classe 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>