Boost::python - заполнение вектора указателя C++ на объект класса в python

Здесь моя проблема. Я должен сделать код Python, способный заполнить вектор указателя C++ на объект класса кода C++. Я использую Boost::Python. Это выглядит следующим образом:

Код C++:

class A_Base {}
class A_derived_1 {}
...
class A_derived_N {}

class B {
...
setAderivediList(vector<A *> &_AderivedList){}
}

Что мне нужно сделать в Python:

B.setAderivediList(_AderivedList)

Я не могу изменить метод в коде C++, я могу только добавить другие объекты между #ifdef python_interface, чтобы не влиять на работу других разработчиков. Сначала я попытался написать конвертер из того, что нашел в Интернете, но мне не удалось заставить его работать для моего кода. Затем я попытался добавить _AderivedList в класс B и сеттер, который заполняет вектор. Хотя он компилируется в C++, он не работает в Python.

Новый B класс:

class B {
...
setAderivediList(vector<A *> &_AderivedList){}
#ifdef myPython_code
public:
  vector<A *> * _AderivedListPy;
  setAListPy(A * &my_Aderived){       //Actually, I tried without the reference as well
  this->_AderivedListPy->push_back(my_Aderived);
};
#endif
}

В питоне это становится:

myB = mydll.B()
Ai = mydll.A_derived_i()
myB.setAListPy(Ai) #stopping here
myB.setAderivediList(myB._AderivedListPy)

Если я использую ссылку, она выдаст сообщение об ошибке "Типы аргументов Python, не соответствующие сигнатуре C++" в myB.setAListPy(Ai), без ссылки она остановится на той же строке, не выдавая никакого сообщения об ошибке. Любая подсказка о том, как я мог бы улучшить этот или любой другой способ сделать это? Заранее спасибо.

1 ответ

На самом деле, я нашел решение своей проблемы. Заполняя вектор (включая вызов setAderivediList) непосредственно в setAListPy. Я просто передаю int my_A_derived в setAListPy (на самом деле, вместе с другими аргументами, необходимыми для всех конструкторов классов A_derived) и использую условие if для my_A_derived.

Другие вопросы по тегам