Наше приложение предоставляет привязки Python через Boost.Python . Однако многие методы API используют типы, определенные сторонними библиотеками: один пример - Eigen , другой - Qt .
Для некоторых из этих библиотек иногда доступны сторонние привязки: для Eigen я нашел minieigen ; для Qt доступно PySide2 .
Вообще, как бы я использовал эти привязки, не написав свои собственные конвертеры для каждого типа? Например, рассмотрим следующее:
class Test
{
public:
static double test(const Eigen::Vector3d& vector)
{
return vector.norm(); //just an example
}
};
BOOST_PYTHON_MODULE(test)
{
using namespace boost::python;
scope classScope = class_<Test>("Test", no_init)
.def("test", &Test::test)
.staticmethod("test")
;
}
Завернуто так, код явно не работает:
>>> from test import Test
>>> import minieigen
>>> Test.test(minieigen.Vector3(0, 1, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
Test.test(Vector3)
did not match C++ signature:
test(Eigen::Matrix<double, 3, 1, 0, 3, 1>)
Я понимаю, что проблема в том, что среда выполнения Boost.Python не проинформирована о типах, обернутых minieigen, поэтому я должен предоставить какой-то "клейкий код". Похоже, что Shiboken (для PySide2) предоставляет API только для этого ( этот вопрос имеет дело с этим, но он все еще смущает меня); однако, похоже, что у minieigen нет ничего подобного.
В прошлом я обнаружил многообещающий фрагмент кода, с помощью которого автор мог бы обернуть / развернуть основные указатели C ++ из PyObject, однако я не смог найти его снова ...
Я был бы признателен за аналогичную процедуру, позволяющую сэкономить на переносе каждого стороннего типа, используемого в нашей программе.