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.