Может ли кто-нибудь предложить способ манипулирования объектами c++ с помощью Cython, когда ожидается, что экземпляр С++ одного класса будет передавать конструктор другого обернутого класс, как описано ниже?
Обратите внимание на примечание к файлу pyx для класса PySession, который принимает объект python PyConfigParams в качестве аргумента, а затем должен извлеките из него значения, чтобы построить С++ ConfigParams объект. затем объект ConfigParams используется для подачи конструктора сессии.
Было бы идеально иметь процедуру, которая позволяла бы мне «вводить» объект ConfigParams c++, обернутый объектом PyConfigParams непосредственно в конструктор Session, без необходимости демонтажа сначала это, а затем создание нового объекта С++ для подачи конструктора. Это работает, конечно. Однако это громоздкий, своего рода брутальный способ реализации этого решения, не говоря уже о ненадежности.
Я знаю о PyCapsule, однако для этого может потребоваться затронуть заголовки c++, чего я не могу сделать.
Связано с этим, но другой вопрос: :что, если мне нужен обернутый class (скажем здесь PySession )для имитации поведения C++ api, возвращая экземпляр ConfigParams? нужно ли мне делать отменить и разобрать объект С++ для создания Python PyConfigParams который затем будет возвращен пользователю Python в мире Python?Любые предложения очень приветствуются! Спасибо!
Предположим, у меня есть два класса C++ с именами ConfigParams и Session. Экземпляр ConfigParams используется для передачи конструктору Класс сеанса:
// ConfigParams.h
#include <iostream>
using namespace std;
class ConfigParams
{
int parameter1;
public:
ConfigParams(int par1) { this->parameter1 = par1;}
int getPar1() { return this->parameter1; }
};
// 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;
}
# 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()
# 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()